home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 23 / Amiga Format AFCD23 (Feb 1998, Issue 107).iso / +look_here_1st!+ / reader_requests / alienbreed3d2 / veryverynewrender.s < prev    next >
Text File  |  1997-11-28  |  67KB  |  4,788 lines

  1.  
  2. SP EQU 1
  3. SPM EQU 1
  4. BS EQU 1
  5. BP EQU 1
  6. SHA EQU 1
  7. PH EQU 1
  8. MB EQU 0
  9. ScreenWidth EQU 320
  10.  
  11. LARGESCREEN equ 1
  12.  
  13.  
  14. * the 'Hello World' program in 68000 Assembler
  15. * the C version can be found in the Intuition manual
  16.  
  17. * this source code (C) HiSoft 1992 All Rights Reserved
  18.  
  19. * for Devpac Amiga Version 2 the following symbols were changed
  20. * to avoid clashes with the new include files:
  21. * Screen->MyScreen, NewScreen->MyNewScreen
  22. * Window->MyWindow, NewWindow->MyNewWindow
  23.  
  24.     opt    c+,d+
  25.  
  26.     include    workbench:utilities/devpac/system            use pre-assembled header
  27.     include    exec/exec_lib.i
  28.     include    intuition/intuition.i
  29.     include    intuition/intuition_lib.i
  30.     include    graphics/graphics_lib.i
  31.     include    graphics/text.i
  32.  
  33. INTUITION_REV    equ    31        v1.1
  34. GRAPHICS_REV    equ    31        v1.1
  35.  
  36. * Open the intuition library
  37.  
  38.     moveq    #100,d4            default error return code
  39.  
  40.     moveq    #INTUITION_REV,d0    version
  41.     lea    int_name(pc),a1
  42.     CALLEXEC OpenLibrary
  43.     tst.l    d0
  44.     beq    exit_false        if failed then quit
  45.     move.l    d0,_IntuitionBase    else save the pointer
  46.  
  47.     moveq    #GRAPHICS_REV,d0
  48.     lea    graf_name(pc),a1
  49.     CALLEXEC OpenLibrary
  50.     tst.l    d0
  51. ;    beq    exit_closeint        if failed then close Int, exit
  52.     move.l    d0,_GfxBase
  53.     lea    MyNewScreen(pc),a0
  54.     CALLINT    OpenScreen        open a screen
  55.     tst.l    d0
  56. ;    beq    exit_closeall        if failed the close both, exit
  57.     move.l    d0,MyScreen
  58.  
  59.     move.l MyScreen,a0
  60.     lea sc_BitMap(a0),a0
  61.     lea bm_Planes(a0),a0
  62.  
  63.     
  64.     move.l #RAWSCRN,(a0)
  65.     move.l #RAWSCRN+10240,4(a0)
  66.     move.l #RAWSCRN+10240*2,8(a0)
  67.     move.l #RAWSCRN+10240*3,12(a0)
  68.     move.l #RAWSCRN+10240*4,16(a0)
  69.     move.l #RAWSCRN+10240*5,20(a0)
  70.     move.l #RAWSCRN+10240*6,24(a0)
  71.     move.l #RAWSCRN+10240*7,28(a0)
  72.  
  73. * now initialise a NewWindow structure. This is normally easier to
  74. * do with dc.w/dc.l statement etc, but for comparison with the C
  75. * version we do it like this
  76.     lea    MyNewWindow(pc),a0    good place to start
  77.     move.w    #20,nw_LeftEdge(a0)
  78.     move.w    #20,nw_TopEdge(a0)
  79.     move.w    #300,nw_Width(a0)
  80.     move.w    #100,nw_Height(a0)
  81.     move.b    #0,nw_DetailPen(a0)
  82.     move.b    #1,nw_BlockPen(a0)
  83.     move.l    #window_title,nw_Title(a0)
  84. _temp    set    WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING
  85.     move.l    #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0)
  86.     move.l    #CLOSEWINDOW,nw_IDCMPFlags(a0)
  87.     move.w    #CUSTOMSCREEN,nw_Type(a0)
  88.     clr.l    nw_FirstGadget(a0)
  89.     clr.l    nw_CheckMark(a0)
  90.     move.l    MyScreen(pc),nw_Screen(a0)
  91.     clr.l    nw_BitMap(a0)
  92.     move.w    #100,nw_MinWidth(a0)
  93.     move.w    #25,nw_MinHeight(a0)
  94.     move.w    #640,nw_MaxWidth(a0)
  95.     move.w    #200,nw_MaxHeight(a0)
  96.  
  97. scrwid    EQU    320
  98. scrht    EQU    256
  99.  
  100.     move.l FASTBUFFER,CHUNKYBUFFER
  101.  
  102.     move.l 4.w,a6
  103.     
  104.     move.l    #scrwid*scrht,d0
  105.     move.l    #MEMF_CLEAR,d1        ;best possible memory
  106.     jsr    _LVOAllocMem(a6)
  107.     move.l    d0,CHUNKYCOMPARE
  108.     beq    nochunkycomp
  109.     
  110.     move.l    #scrwid*scrht,d0
  111.     move.l    #MEMF_CHIP+MEMF_CLEAR,d1
  112.     jsr    _LVOAllocMem(a6)
  113.     move.l    d0,CHIPBUF1
  114.     beq    nochipbuf1
  115.     
  116.     move.l    #scrwid*scrht,d0
  117.     move.l    #MEMF_CHIP+MEMF_CLEAR,d1
  118.     jsr    _LVOAllocMem(a6)
  119.     move.l    d0,CHIPBUF2
  120.     beq    nochipbuf2
  121.     
  122.     move.l    4.w,a6
  123.     move.l    #-1,d0
  124.     jsr    _LVOAllocSignal(a6)
  125.     move.l    d0,SIG1
  126.     blt    nosig1
  127.  
  128.     move.l    4.w,a6
  129.     move.l    #-1,d0
  130.     jsr    _LVOAllocSignal(a6)
  131.     move.l    d0,SIG2
  132.     blt    nosig2
  133.     
  134.     ;set the signals to say that the previous ctp conversion
  135.     ;has been completed
  136.     move.l    4.w,a6
  137.     move.l    SIG1,d0
  138.     or.l    SIG2,d0
  139.     move.l    d0,d1
  140.     jsr    _LVOSetSignal(a6)
  141.     
  142.     ;initialise ctp routine
  143.     move.l    CHUNKYBUFFER,a0        ;chunky buffer
  144.     move.l    CHUNKYCOMPARE,a1    ;chunky compare buffer
  145. ;    move.l    MyScreen,a2
  146. ;    lea    sc_BitMap(a2),a2
  147. ;    lea    bm_Planes(a2),a2    ;plane pointer
  148.     move.l #backupptr,a2
  149.     move.l    _GfxBase,a3
  150.     move.l    #1,d0            ;signals1
  151.     move.l    #2,d1            ;signals2
  152.     move.l    #scrwid*scrht,d2    ;number of pixels
  153.     move.l    #0,d3            ;byte offset
  154.     move.l    CHIPBUF1,d4
  155.     move.l    CHIPBUF2,d5
  156.     jsr    _c2p8_init
  157.     
  158.  
  159.  
  160. * thats it set up, now open the window (a0=NewWindow already)
  161. ;    CALLINT    OpenWindow
  162. ;    tst.l    d0
  163. ;    beq    exit_closescr            if failed
  164. ;    move.l    d0,MyWindow            save it
  165. ;
  166. ;    move.l    d0,a1                window
  167. ;    move.l    wd_RPort(a1),a1            rastport
  168. ;    moveq    #20,d0                X
  169. ;    moveq    #20,d1                Y
  170. ;    CALLGRAF Move                move the cursor
  171. ;
  172. ;    move.l    MyWindow(pc),a0
  173. ;    move.l    wd_RPort(a0),a1            rastport
  174. ;    lea    hello_message(pc),a0
  175. ;    moveq    #11,d0
  176. ;    CALLGRAF Text                print something
  177. ;
  178. ;    move.l    MyWindow(pc),a0
  179. ;    move.l    wd_UserPort(a0),a0
  180. ;    move.b    MP_SIGBIT(a0),d1        (misprint in manual)
  181. ;    moveq    #0,d0
  182. ;    bset    d1,d0                do a shift
  183. ;    CALLEXEC Wait
  184.  
  185. ;    moveq    #0,d4                return code
  186.  
  187. * various exit routines that do tidying up, given a return code in d4
  188.  
  189. ;    move.l    MyWindow(pc),a0
  190. ;    CALLINT CloseWindow
  191.  
  192. ;exit_closescr
  193. ;    move.l    MyScreen(pc),a0
  194. ;    CALLINT CloseScreen
  195.  
  196. ;exit_closeall
  197. ;    move.l    _GfxBase(pc),a1
  198. ;    CALLEXEC CloseLibrary
  199.  
  200. ;exit_closeint
  201. ;    move.l    _IntuitionBase(pc),a1
  202. ;    CALLEXEC CloseLibrary
  203.  
  204. ;done:
  205. ;    bra done
  206.  
  207. SPECULAR EQU SP
  208. SPECMAP EQU SPM
  209. BUMPSPEC EQU BS
  210. BUMPPHONG EQU BP
  211. SHADOWMAP EQU SHA
  212. SHADING EQU PH
  213. MOTIONBLUR EQU MB
  214.  
  215.  
  216.  move.l #PALETTEBIT,a0
  217.  move.l #COPIEDPAL+4,a1
  218.  move.w #255,d0
  219.  
  220. copydown:
  221.  move.b 1(a0),(a1)
  222.  move.b 3(a0),4(a1)
  223.  move.b 5(a0),8(a1)
  224.  add.w #6,a0
  225.  add.w #12,a1
  226.  dbra d0,copydown
  227.  
  228.  move.w #256,COPIEDPAL
  229.  move.w #0,COPIEDPAL+2
  230. LOOKFORME:
  231.  move.l MyScreen,a0
  232.  lea sc_ViewPort(a0),a0
  233.  move.l #COPIEDPAL,a1
  234.  move.l _GfxBase,a6
  235.  jsr -$372(a6)
  236.  
  237.  move.l MyScreen,a4
  238.  move.w sc_MouseX(a4),d0
  239.  move.w sc_MouseY(a4),d1
  240.  move.w d0,OLDXM
  241.  move.w d1,OLDYM
  242.     
  243.  move.l 4.w,a6
  244.  move.l #doslibname,a1
  245.  moveq #0,d0
  246.  jsr -552(a6)
  247.  move.l d0,doslib
  248.  
  249.  move.l doslib,a6
  250.  move.l #OBJNAME,d1
  251.  move.l #1005,d2
  252.  jsr -30(a6)
  253.  move.l d0,ROTATEDPTS
  254.  
  255.  move.l doslib,a6
  256.  move.l d0,d1
  257.  move.l #POLYGONDATA,d2
  258.  move.l #30000,d3
  259.  jsr -42(a6)
  260.  
  261.  move.l doslib,a6
  262.  move.l ROTATEDPTS,d1
  263.  jsr -36(a6)
  264.  
  265. loop:
  266.  
  267.  move.w #0,temp
  268.  
  269.  move.l #POLYGONDATA,a3
  270.  move.w (a3)+,SORTIT
  271.  move.l a3,START_OF_OBJECT
  272.     
  273.  move.w (a3)+,num_points
  274.  move.w (a3)+,d6
  275.  move.w d6,num_frames
  276.  move.l a3,POINTER_TO_POINTERS
  277.  lea (a3,d6.w*4),a3
  278.  move.l a3,LinesPtr
  279.  moveq #0,d5
  280.  moveq #0,d2
  281.  
  282.  move.l POINTER_TO_POINTERS,a4
  283.  move.w (a4,d5.w*4),d2
  284.  add.l START_OF_OBJECT,d2
  285.  move.l d2,PtsPtr
  286.  move.w 2(a4,d5.w*4),d5
  287.  add.l START_OF_OBJECT,d5
  288.  move.l d5,PolyAngPtr
  289.  move.l d2,a3
  290.  move.w num_points,d5
  291.  
  292.  move.l (a3)+,OBJONOFF
  293.  
  294.  move.l a3,PointAngPtr
  295.  add.w d5,d5
  296.  move.w d5,d2
  297.  add.w d5,d5
  298.  add.w d5,d2
  299.  add.w d2,a3
  300.  move.l a3,PtsPtr
  301.  
  302.  move.l MyScreen,a4
  303.  move.w sc_MouseX(a4),d0
  304.  move.w sc_MouseY(a4),d1
  305.  
  306.  sub.w OLDXM,d0
  307.  sub.w OLDYM,d1
  308.  add.w d0,OLDXM
  309.  add.w d1,OLDYM
  310.  
  311.  btst #6,$bfe001
  312.  beq.s .SHIFTABOUT
  313.  
  314.  muls #8190,d0
  315.  divs #320,d0
  316.  add.w d0,YANG
  317.  and.w #8190,YANG
  318.  muls #8190,d1
  319.  divs #320,d1
  320.  and.w #8190,d1
  321.  add.w d1,XANG
  322.  and.w #8190,XANG
  323.  
  324. ; add.w #40,AANG
  325. ; add.w #70,BANG
  326. ; and.w #8191,AANG
  327. ; and.w #8191,BANG
  328.  
  329. ; add.w #60,CANG
  330. ; add.w #90,DANG
  331. ; and.w #8191,CANG
  332. ; and.w #8191,DANG
  333.  
  334.  
  335.  bra .ROTABOUT
  336. .SHIFTABOUT
  337.  
  338.   muls #8190,d0
  339.  divs #320,d0
  340.  add.w d0,BANG
  341.  and.w #8190,BANG
  342.  muls #8190,d1
  343.  divs #320,d1
  344.  and.w #8190,d1
  345.  add.w d1,AANG
  346.  and.w #8190,AANG
  347.  
  348.  
  349. .ROTABOUT
  350.  
  351.  move.w AANG,d1
  352.  move.w BANG,d3
  353. ; cmp.w #2,d6
  354. ; bne.s .notsecrot
  355. ; move.w CANG,d1
  356. ; move.w DANG,d3
  357. ;.notsecrot
  358.  move.l #SINETABLE,a1
  359.  move.w (a1,d1.w),XSIN    ;xsin
  360.  move.w (a1,d3.w),YSIN    ;ysin
  361.  
  362.  add.w #2048,a1
  363.  move.w (a1,d1.w),XCOS    ;xcos
  364.  move.w (a1,d3.w),YCOS    ;ycos
  365.  
  366.  move.w XANG,d1
  367.  move.w YANG,d3
  368. ; cmp.w #2,d6
  369. ; bne.s .notsecrot
  370. ; move.w CANG,d1
  371. ; move.w DANG,d3
  372. ;.notsecrot
  373.  move.l #SINETABLE,a1
  374.  move.w (a1,d1.w),XSIN2    ;xsin
  375.  move.w (a1,d3.w),YSIN2    ;ysin
  376.  
  377.  add.w #2048,a1
  378.  move.w (a1,d1.w),XCOS2    ;xcos
  379.  move.w (a1,d3.w),YCOS2    ;ycos
  380.  
  381.  
  382. ************************************************
  383. ************************************************
  384. ************************************************
  385. ************************************************
  386. ************************************************
  387. ************************************************
  388. ************************************************
  389. ************************************************
  390. ************************************************
  391. ************************************************
  392. ************************************************
  393. ************************************************
  394. ************************************************
  395. ************************************************
  396.  
  397. *SHADOW BUFFER CALCULATION
  398.  
  399.  
  400. ; First, calculate the normal brightnesses
  401. ; for points. NB: -1,-1,-1 = this point not used
  402. ; in gouraud shading.
  403.  
  404.  move.l #NORMBRIGHTS,a2
  405.  move.l PointAngPtr,a0
  406.  move.w num_points,d7
  407.  
  408.  move.l #NORMVECTS,a5
  409.  
  410.  subq #1,d7
  411.  
  412. CALCNORMBRIGHTS:
  413.  
  414.  move.w (a0)+,d0
  415.  move.w (a0)+,d1
  416.  move.w (a0)+,d2
  417.  
  418.  move.w #0,d6
  419.  
  420.  cmp.w #-1,d0
  421.  bne.s .notnot
  422.  cmp.w #-1,d1
  423.  bne.s .notnot
  424.  cmp.w #-1,d2
  425.  bne.s .notnot
  426.  
  427.  move.w #-1,x1
  428.  move.w #-1,y1
  429.  move.w #-1,z1
  430.  bra .dontbother
  431.  
  432. .notnot:
  433.  neg.w d1
  434.  
  435.  move.w d0,d3
  436.  move.w d2,d5
  437.  
  438.  muls YCOS,d0
  439.  muls YSIN,d2
  440.  sub.l d2,d0
  441.  add.l d0,d0
  442.  swap d0
  443. ; asr.l #6,d0    ; new x*512
  444.  
  445.  muls YSIN,d3
  446.  muls YCOS,d5
  447.  add.l d5,d3
  448.  add.l d3,d3
  449.  swap d3
  450.  move.w d3,d2    ; new z
  451.  
  452.  move.w d1,d4
  453.  move.w d2,d5
  454.  muls XCOS,d1
  455.  muls XSIN,d2
  456.  sub.l d2,d1
  457.  add.l d1,d1
  458.  swap d1
  459.  
  460.  muls XSIN,d4
  461.  muls XCOS,d5
  462.  add.l d5,d4
  463.  add.l d4,d4
  464.  swap d4
  465.  move.w d4,d2    ; new z
  466.  
  467.  
  468.  move.w d0,d3
  469.  move.w d2,d5
  470.  
  471.  muls YCOS2,d0
  472.  muls YSIN2,d2
  473.  sub.l d2,d0
  474.  add.l d0,d0
  475.  swap d0
  476.  
  477.  muls YSIN2,d3
  478.  muls YCOS2,d5
  479.  add.l d5,d3    
  480.  add.l d3,d3
  481.  swap d3
  482.  move.w d3,d2    ; new z
  483.  
  484.  move.w d1,d4
  485.  move.w d2,d5
  486.  muls XCOS2,d1
  487.  muls XSIN2,d2
  488.  sub.l d2,d1
  489.  add.l d1,d1
  490.  swap d1
  491.  
  492.  muls XSIN2,d4
  493.  muls XCOS2,d5
  494.  add.l d5,d4
  495.  add.l d4,d4
  496.  swap d4
  497.  
  498.  move.w d0,x1
  499.  move.w d1,y1
  500.  move.w d4,z1
  501.  
  502.  tst.w y1
  503.  blt.s .okpos
  504.  
  505.  move.w x1,d1    ; 0-1024
  506.  asr.w #4,d1    ; 0-64
  507.  move.w z1,d2    ; 0-1024
  508.  asr.w #4,d2    ; 0-64
  509.  
  510.  muls d1,d1
  511.  muls d2,d2
  512.  add.l d1,d2
  513.  jsr CALCSQROOT
  514.  tst.w d2
  515.  beq.s .okpos
  516.  
  517.  move.w d2,d3    ; 0-64
  518.  neg.w d3
  519.  add.w #127,d3    ; 64-127
  520.  
  521.  move.w z1,d4
  522.  muls d3,d4
  523.  divs d2,d4
  524.  
  525.  move.w x1,d0
  526.  muls d3,d0
  527.  divs d2,d0
  528.  
  529. ; asr.w #1,d4
  530. ; asr.w #1,d0
  531.  
  532. ; neg.w y3
  533.  
  534. .okpos
  535.  
  536.  asr.w #4,d4
  537.  add.w #128,d4
  538.  move.b d4,d6
  539.  lsl.w #8,d6
  540.  asr.w #4,d0
  541.  add.w #128,d0
  542.  move.b d0,d6
  543.  
  544. ; move.w d1,d6    ; new y 
  545. ;
  546. ; asr.w #4,d6
  547. ; add.w #20,d6
  548. ; ble.s .okokok
  549. ; moveq #0,d6
  550. ;.okokok:
  551. ; add.w #$1c,d6
  552. ; cmp.w #1,d6
  553. ; bge.s .okokokok
  554. ; moveq #1,d6
  555. ;.okokokok:
  556.  
  557. ; add.w #64,d6
  558. ; cmp.w #28,d6
  559. ; blt.s .okbig
  560. ; move.w #28,d6
  561. ;.okbig
  562.  
  563. .dontbother:
  564.  move.w x1,(a5)+
  565.  move.w y1,(a5)+
  566.  move.w z1,(a5)+
  567.  move.w d6,(a2)+
  568.  
  569.  dbra d7,CALCNORMBRIGHTS
  570.  
  571.  
  572. ; Next, calculate the point coords for
  573. ; the shadow buffer.
  574.  
  575.  move.l #SHADOWPTS,a2
  576.  move.l PtsPtr,a0
  577.  move.w num_points,d7
  578.  subq #1,d7
  579.  
  580. ROTPTLOPSHAD:
  581.  move.w (a0)+,d0
  582.  move.w d0,d3
  583.  move.w (a0)+,d1
  584.  move.w (a0)+,d2
  585.  move.w d2,d5
  586.  
  587.  muls YCOS,d0
  588.  muls YSIN,d2
  589.  sub.l d2,d0
  590.  add.l d0,d0
  591.  swap d0
  592. ; asr.l #6,d0    ; new x*512
  593.  
  594.  muls YSIN,d3
  595.  muls YCOS,d5
  596.  add.l d5,d3
  597.  add.l d3,d3
  598.  swap d3
  599.  move.w d3,d2    ; new z
  600.  
  601.  move.w d1,d4
  602.  move.w d2,d5
  603.  muls XCOS,d1
  604.  muls XSIN,d2
  605.  sub.l d2,d1
  606.  add.l d1,d1
  607.  swap d1
  608.  
  609.  muls XSIN,d4
  610.  muls XCOS,d5
  611.  add.l d5,d4
  612.  add.l d4,d4
  613.  swap d4
  614.  move.w d4,d2    ; new z
  615.   
  616.  move.w d0,d3
  617.  move.w d2,d5
  618.  
  619.  muls YCOS2,d0
  620.  muls YSIN2,d2
  621.  sub.l d2,d0
  622.  asr.l #6,d0    ; new x*512
  623.  
  624.  muls YSIN2,d3
  625.  muls YCOS2,d5
  626.  add.l d5,d3
  627.  add.l d3,d3
  628.  swap d3
  629.  move.w d3,d2    ; new z
  630.  
  631.  move.w d1,d4
  632.  move.w d2,d5
  633.  muls XCOS2,d1
  634.  muls XSIN2,d2
  635.  sub.l d2,d1
  636.  asr.l #6,d1    ; new y*512
  637.  
  638.  muls XSIN2,d4
  639.  muls XCOS2,d5
  640.  add.l d5,d4
  641.  add.l d4,d4
  642.  swap d4
  643.  move.w d4,d2    ; new z
  644.  
  645.  ext.l d2
  646.  
  647.  move.w XOFF,d5
  648.  ext.l d5
  649.  asl.l #8,d5
  650.  add.l d5,d5
  651.  add.l d5,d0
  652.  
  653.  move.l d0,(a2)+
  654.  move.l d1,(a2)+
  655.  move.w d2,(a2)+
  656.  
  657.  dbra d7,ROTPTLOPSHAD
  658.  
  659.  
  660.  
  661. ***************************************
  662. * Calculate viewer position for specularity..
  663.  
  664.  move.w #0,d0
  665.  move.w #0,d1
  666.  move.w #-1024,d2
  667.  
  668. ; move.w d0,d3
  669. ; move.w d2,d5
  670. ;
  671. ; muls YCOS,d0
  672. ; muls YSIN,d2
  673. ; sub.l d2,d0
  674. ; add.l d0,d0
  675. ; swap d0
  676. ; asr.l #6,d0    ; new x*512
  677. ; muls YSIN,d3
  678. ; muls YCOS,d5
  679. ; add.l d5,d3
  680. ; add.l d3,d3
  681. ; swap d3
  682. ; move.w d3,d2    ; new z
  683. ;
  684. ; move.w d1,d4
  685. ; move.w d2,d5
  686. ; muls XCOS,d1
  687. ; muls XSIN,d2
  688. ; sub.l d2,d1
  689. ; add.l d1,d1
  690. ; swap d1
  691. ; muls XSIN,d4
  692. ; muls XCOS,d5
  693. ; add.l d5,d4
  694. ; add.l d4,d4
  695. ; swap d4
  696. ; move.w d4,d2    ; new z
  697.  
  698.  move.w d0,d3
  699.  move.w d2,d5
  700.  
  701.  muls YCOS2,d0
  702.  muls YSIN2,d2
  703.  sub.l d2,d0
  704.  add.l d0,d0
  705.  swap d0
  706.  
  707.  muls YSIN2,d3
  708.  muls YCOS2,d5
  709.  add.l d5,d3    
  710.  add.l d3,d3
  711.  swap d3
  712.  move.w d3,d2    ; new z
  713.  
  714.  move.w d1,d4
  715.  move.w d2,d5
  716.  muls XCOS2,d1
  717.  muls XSIN2,d2
  718.  sub.l d2,d1
  719.  add.l d1,d1
  720.  swap d1
  721. ; asr.l #6,d1    ; new y*512
  722.  
  723.  muls XSIN2,d4
  724.  muls XCOS2,d5
  725.  add.l d5,d4
  726.  add.l d4,d4
  727.  swap d4
  728.  
  729.  move.w d0,x2b
  730.  move.w d1,y2b
  731.  move.w d4,z2b
  732.  
  733. ; Now the specular highlight efforts....
  734.  
  735.  move.l #SPECBRIGHTS,a2
  736.  move.l #NORMVECTS,a1
  737.  
  738.  move.l #SHADOWPTS,a5
  739.  
  740.  move.w num_points,d7
  741.  subq #1,d7
  742.  
  743. CALCSPECBRIGHTS:
  744.  
  745.  move.w (a1)+,x1
  746.  move.w (a1)+,y1
  747.  move.w (a1)+,z1
  748.  
  749.  move.w x2b,d0
  750.  move.l (a5)+,d1
  751.  asr.l #8,d1
  752.  asr.l #1,d1
  753.  sub.w d1,d0
  754.  move.w d0,x2
  755.  move.w y2b,d0
  756.  move.l (a5)+,d1
  757.  asr.l #8,d1
  758.  asr.l #1,d1
  759.  sub.w d1,d0
  760.  move.w d0,y2
  761.  move.w z2b,d0
  762.  sub.w (a5)+,d0
  763.  move.w d0,z2
  764.  
  765.  move.w #0,d6
  766.  
  767.  cmp.w #-1,x1
  768.  bne.s .notnot
  769.  cmp.w #-1,y1
  770.  bne.s .notnot
  771.  cmp.w #-1,z1
  772.  beq .dontbother
  773. .notnot: 
  774.  
  775.  move.w x2,d2
  776.  muls d2,d2
  777.  move.w y2,d1
  778.  muls d1,d1
  779.  add.l d1,d2
  780.  move.w z2,d1
  781.  muls d1,d1
  782.  add.l d1,d2
  783.  
  784.  jsr CALCSQROOT
  785.  
  786.  move.w d2,l2
  787.  
  788.  move.w y1,d0
  789.  muls z2,d0
  790.  move.w y2,d1
  791.  muls z1,d1
  792.  sub.l d1,d0    ; x4
  793.  
  794.  move.w z1,d1
  795.  muls x2,d1
  796.  move.w z2,d2
  797.  muls x1,d2
  798.  sub.l d2,d1    ; y4
  799.  
  800.  move.w x1,d2
  801.  muls y2,d2
  802.  move.w x2,d3
  803.  muls y1,d3
  804.  sub.l d3,d2    ; z4
  805.  
  806.  asr.l #8,d0
  807.  asr.l #8,d1
  808.  asr.l #8,d2
  809.  asr.l #2,d0
  810.  asr.l #2,d1
  811.  asr.l #2,d2
  812.  
  813.  move.w x1,d3
  814.  muls d1,d3
  815.  move.w y1,d4
  816.  muls d0,d4
  817.  sub.l d4,d3
  818.  asr.l #8,d3
  819.  asr.l #1,d3
  820.  add.w z2,d3
  821.  
  822.  muls #1024,d3
  823.  divs l2,d3
  824.  
  825.  move.w d3,z3
  826.  
  827.  move.w y1,d3
  828.  muls d2,d3
  829.  move.w z1,d4
  830.  muls d1,d4
  831.  sub.l d4,d3
  832.  asr.l #8,d3
  833.  asr.l #1,d3
  834.  add.w x2,d3
  835.  muls #1024,d3
  836.  divs l2,d3
  837.  
  838.  move.w d3,x3
  839.  
  840.  move.w z1,d3
  841.  muls d0,d3
  842.  move.w x1,d4
  843.  muls d2,d4
  844.  sub.l d4,d3
  845.  asr.l #8,d3
  846.  asr.l #1,d3
  847.  add.w y2,d3
  848.  muls #1024,d3
  849.  divs l2,d3
  850.  
  851.  move.w d3,y3
  852.  
  853.  move.w z3,d3
  854.  asr.w #4,d3
  855.  add.w #128,d3
  856.  
  857.  move.b d3,d6
  858.  lsl.w #8,d6
  859.  
  860.  move.w x3,d3
  861.  asr.w #4,d3
  862.  add.w #128,d3
  863.  move.b d3,d6
  864.   
  865.  tst.w y3
  866.  blt.s .okpos
  867.  
  868.  move.w x3,d1
  869.  asr.w #4,d1
  870.  move.w z3,d2
  871.  asr.w #4,d2
  872.  
  873.  muls d1,d1
  874.  muls d2,d2
  875.  add.l d1,d2
  876.  jsr CALCSQROOT
  877.  tst.w d2
  878.  beq.s .okpos
  879.  
  880.  move.w d2,d3
  881.  neg.w d3
  882.  add.w #127,d3
  883.  
  884.  move.w z3,d4
  885.  muls d3,d4
  886.  divs d2,d4
  887.  asr.w #4,d4
  888.  add.w #128,d4
  889.  move.b d4,d6
  890.  lsl.w #8,d6
  891.  
  892.  move.w x3,d4
  893.  muls d3,d4
  894.  divs d2,d4
  895.  asr.w #4,d4
  896.  add.w #128,d4
  897.  move.b d4,d6
  898.  
  899. ; neg.w y3
  900.  
  901. .okpos
  902.   
  903. ; add.w y2,d3
  904. ;
  905. ; move.w d3,d6
  906. ;
  907. ; asr.w #4,d6
  908. ; add.w #30,d6
  909. ; ble.s .okokok
  910. ; moveq #0,d6
  911. ;.okokok:
  912. ; add.w #$1c,d6
  913. ;
  914. ; cmp.w #1,d6
  915. ; bge.s .okokokok
  916. ; moveq #1,d6
  917. ;.okokokok:
  918.  
  919. ; cmp.w #28,d6
  920. ; blt.s .okbig
  921. ; move.w #28,d6
  922. ;.okbig
  923.  
  924. .dontbother:
  925.  move.w d6,(a2)+
  926.  move.w y3,(a2)+
  927.  
  928.  dbra d7,CALCSPECBRIGHTS
  929.  
  930.  
  931.  
  932.  
  933. * NOW THE POINTS FOR ON-SCREENNESS
  934.  
  935.  move.l #ROTATEDPTS,a2
  936.  move.l PtsPtr,a0
  937.  move.w num_points,d7
  938.  subq #1,d7
  939.  
  940. ROTPTLOP:
  941.  
  942.  move.w (a0)+,d0
  943.  move.w d0,d3
  944.  move.w (a0)+,d1
  945.  move.w (a0)+,d2
  946.  move.w d2,d5
  947.  
  948.  
  949.  
  950.  muls YCOS,d0
  951.  muls YSIN,d2
  952.  sub.l d2,d0
  953.  asr.l #6,d0    ; new x*512
  954.  
  955.  muls YSIN,d3
  956.  muls YCOS,d5
  957.  add.l d5,d3
  958.  add.l d3,d3
  959.  swap d3
  960.  move.w d3,d2    ; new z
  961.  
  962.  move.w d1,d4
  963.  move.w d2,d5
  964.  muls XCOS,d1
  965.  muls XSIN,d2
  966.  sub.l d2,d1
  967.  asr.l #6,d1    ; new y*512
  968.  
  969.  muls XSIN,d4
  970.  muls XCOS,d5
  971.  add.l d5,d4
  972.  add.l d4,d4
  973.  swap d4
  974.  move.w d4,d2    ; new z
  975.  
  976.  ext.l d2
  977.  
  978.  move.w XOFF,d5
  979.  ext.l d5
  980.  asl.l #8,d5
  981.  add.l d5,d5
  982.  add.l d5,d0
  983.  
  984.  move.l d0,(a2)+
  985.  move.l d1,(a2)+
  986.  move.w d2,(a2)+
  987.  
  988.  dbra d7,ROTPTLOP
  989.  
  990. ; Now convert the rotated points to the screen:
  991.  
  992.  move.l #ROTATEDPTS,a0
  993.  move.l #ONSCREENPTS,a2
  994.  move.w num_points,d7
  995.  subq #1,d7
  996. CONVERTTOSCREEN:
  997.  move.l (a0)+,d0
  998.  move.l (a0)+,d1
  999.  move.w (a0)+,d2
  1000.  add.w ZOFF,d2
  1001.  ext.l d2
  1002.  
  1003.  move.l d0,d3
  1004.  asr.l #1,d3
  1005.  add.l d3,d0 
  1006.  move.l d1,d3
  1007.  asr.l #1,d3
  1008.  add.l d3,d1 
  1009.  
  1010.  divs d2,d0
  1011.  divs d2,d1
  1012.  add.w #160*4,d0
  1013.  add.w #128*4,d1
  1014.  move.w d0,(a2)+
  1015.  move.w d1,(a2)+
  1016.  dbra d7,CONVERTTOSCREEN
  1017.  
  1018.  move.w #254,HIGHPOLY
  1019.  
  1020.  move.l LinesPtr,a1
  1021.  move.l #PartBuffer,a0
  1022.  move.l a0,a2
  1023.  move.w #15,d0
  1024. clrpartbuffSHAD:
  1025.  move.l #$80000001,(a2)+
  1026.  move.l #$80000001,(a2)+
  1027.  move.l #$80000001,(a2)+
  1028.  move.l #$80000001,(a2)+
  1029.  dbra d0,clrpartbuffSHAD
  1030.  
  1031.  move.l #SHADOWPTS,a2
  1032.  move.l OBJONOFF,d5
  1033.  
  1034.  move.w #0,d4
  1035.  tst.w SORTIT
  1036.  bne.s PutInPartsSHAD
  1037.  
  1038.  
  1039. putinunsortedSHAD:
  1040.  move.w (a1)+,d7
  1041.  blt doneallpartsSHAD
  1042.  lsr.l #1,d5
  1043.  bcs.s .yeson
  1044.  addq #2,a1
  1045.  bra putinunsortedSHAD
  1046. .yeson:
  1047.  
  1048.  move.w (a1)+,d6
  1049.  move.l #0,(a0)+
  1050.  move.w d7,(a0)+
  1051.  move.w d4,(a0)+
  1052.  addq #1,d4
  1053.  bra putinunsortedSHAD
  1054.  
  1055. PutInPartsSHAD
  1056.  move.w (a1)+,d7
  1057.  blt doneallpartsSHAD
  1058.  
  1059.  lsr.l #1,d5
  1060.  bcs.s .yeson
  1061.  addq #2,a1
  1062.  bra PutInPartsSHAD
  1063. .yeson:
  1064.  
  1065.  move.w (a1)+,d6
  1066.  move.l 4(a2,d6.w),d0
  1067.  add.l #200000,d0
  1068.  
  1069.  move.l #PartBuffer-8,a0
  1070.  
  1071. stillfrontSHAD
  1072.  addq #8,a0
  1073.  cmp.l (a0),d0
  1074.  blt stillfrontSHAD
  1075.  move.l #endparttab-8,a5
  1076. domoreshiftSHAD:
  1077.  move.l -8(a5),(a5)
  1078.  move.l -4(a5),4(a5)
  1079.  subq #8,a5
  1080.  cmp.l a0,a5
  1081.  bgt.s domoreshiftSHAD
  1082.  
  1083.  move.l d0,(a0)
  1084.  move.w d7,4(a0)
  1085.  move.w d4,6(a0)
  1086.  addq #1,d4
  1087.  bra PutInPartsSHAD
  1088.  
  1089. doneallpartsSHAD:
  1090.  
  1091.  move.l #PartBuffer,a0
  1092.  
  1093. PartLoopSHAD
  1094.  move.l (a0)+,d7
  1095.  blt nomorepartsSHAD
  1096.  
  1097.  move.l #SAVEHIGHS,a2
  1098.  move.w 2(a0),d0
  1099.  move.w HIGHPOLY,(a2,d0.w*2)
  1100.  
  1101.  moveq #0,d0
  1102.  move.w (a0),d0
  1103.  addq #4,a0
  1104.  add.l START_OF_OBJECT,d0
  1105.  move.l d0,a1
  1106.  
  1107. polylooSHAD:
  1108.  
  1109.  tst.w (a1)
  1110.  blt.s nomorepolysSHAD
  1111.  movem.l a0/a1/d7,-(a7)
  1112.  bsr doaSHADEpoly
  1113.  movem.l (a7)+,a0/a1/d7
  1114.  
  1115.  move.w (a1),d0
  1116.  lea 18(a1,d0.w*4),a1
  1117.  
  1118.  bra.s polylooSHAD
  1119. nomorepolysSHAD:
  1120.  sub.w #1,HIGHPOLY
  1121.  bra PartLoopSHAD
  1122. nomorepartsSHAD:
  1123.  
  1124. *******************************************
  1125. * Now the on-screen bit...
  1126. *******************************************
  1127.  
  1128.  move.l LinesPtr,a1
  1129.  move.l #PartBuffer,a0
  1130.  move.l a0,a2
  1131.  move.w #15,d0
  1132. clrpartbuff:
  1133.  move.l #$80000001,(a2)+
  1134.  move.l #$80000001,(a2)+
  1135.  move.l #$80000001,(a2)+
  1136.  move.l #$80000001,(a2)+
  1137.  dbra d0,clrpartbuff
  1138.  
  1139.  move.l #ROTATEDPTS,a2
  1140.  move.l OBJONOFF,d5
  1141.  
  1142.  moveq #0,d4
  1143.  
  1144.  tst.w SORTIT
  1145.  bne.s PutInParts
  1146.  
  1147. putinunsorted:
  1148.  move.w (a1)+,d7
  1149.  blt doneallparts
  1150.  lsr.l #1,d5
  1151.  bcs.s .yeson
  1152.  addq #2,a1
  1153.  bra putinunsorted
  1154. .yeson:
  1155.  
  1156.  move.w (a1)+,d6
  1157.  move.l #0,(a0)+
  1158.  move.w d7,(a0)+
  1159.  move.w d4,(a0)+
  1160.  
  1161.  addq #1,d4
  1162.  bra putinunsorted
  1163.  
  1164. PutInParts
  1165.  move.w (a1)+,d7
  1166.  blt doneallparts
  1167.  
  1168.  lsr.l #1,d5
  1169.  bcs.s .yeson
  1170.  addq #2,a1
  1171.  bra PutInParts
  1172. .yeson:
  1173.  
  1174.  move.w (a1)+,d6
  1175.  move.l (a2,d6.w),d0
  1176.  asr.l #8,d0
  1177.  asr.l #2,d0
  1178.  muls d0,d0
  1179.  move.l 4(a2,d6.w),d2
  1180.  asr.l #8,d2
  1181.  asr.l #2,d2
  1182.  muls d2,d2
  1183.  add.l d2,d0 
  1184.  move.w 8(a2,d6.w),d2
  1185.  add.w #1024,d2
  1186.  muls d2,d2
  1187.  add.l d2,d0
  1188.  
  1189.  move.l #PartBuffer-8,a0
  1190.  
  1191. stillfront
  1192.  addq #8,a0
  1193.  cmp.l (a0),d0
  1194.  blt stillfront
  1195.  move.l #endparttab-8,a5
  1196. domoreshift:
  1197.  move.l -8(a5),(a5)
  1198.  move.l -4(a5),4(a5)
  1199.  subq #8,a5
  1200.  cmp.l a0,a5
  1201.  bgt.s domoreshift
  1202.  
  1203.  move.l d0,(a0)
  1204.  move.w d7,4(a0)
  1205.  move.w d4,6(a0)
  1206.  addq #1,d4
  1207.  bra PutInParts
  1208.  
  1209. doneallparts:
  1210.  
  1211.  move.l #PartBuffer,a0
  1212.  
  1213. PartLoop
  1214.  move.l (a0)+,d7
  1215.  blt nomoreparts
  1216.  
  1217.  move.l #SAVEHIGHS,a2
  1218.  move.w 2(a0),d0
  1219.  move.w (a2,d0.w*2),HIGHPOLY
  1220.  
  1221.  moveq #0,d0
  1222.  move.w (a0),d0
  1223.  addq #4,a0
  1224.  add.l START_OF_OBJECT,d0
  1225.  move.l d0,a1
  1226.  
  1227. polyloo:
  1228.  
  1229.  tst.w (a1)
  1230.  blt.s nomorepolys
  1231.  movem.l a0/a1/d7,-(a7)
  1232.  bsr doapoly
  1233.  movem.l (a7)+,a0/a1/d7
  1234.  
  1235.  move.w (a1),d0
  1236.  lea 18(a1,d0.w*4),a1
  1237.  
  1238.  bra.s polyloo
  1239. nomorepolys:
  1240.  sub.w #1,HIGHPOLY
  1241.  bra PartLoop
  1242. nomoreparts:
  1243.  
  1244. NOPOLYS:
  1245.  
  1246. ; btst #6,$bfe001
  1247. ; beq.s .SHOWSHADOW
  1248.  
  1249.  ifne MOTIONBLUR
  1250.  
  1251.  move.l FASTBUFFER,d0
  1252.  cmp.l #fasty,d0
  1253.  bne .SHOWNSCRN
  1254.  
  1255.  move.l #fasty,a0
  1256.  move.l #fasty2,a1
  1257.  add.l #40*320+64,a0
  1258.  add.l #40*320+64,a1
  1259.  move.l #BLUR,a2
  1260.  move.w #175,d0
  1261.  moveq #0,d6
  1262. .blurchunk:
  1263.  move.w #(192/4)-1,d1
  1264. .blurline:
  1265.  
  1266.  move.l (a0),d2
  1267.  move.l d2,d4
  1268.  swap d4
  1269.  move.l (a1)+,d3
  1270.  move.l d3,d5
  1271.  swap d5
  1272.   
  1273.  lsr.w #8,d5
  1274.  move.b d5,d4
  1275.  move.w d4,d6
  1276.  move.b (a2,d6.l),d7
  1277.  
  1278.  lsl.l #8,d7
  1279.  lsl.l #8,d2
  1280.  lsl.l #8,d3
  1281.  move.l d2,d4
  1282.  move.l d3,d5
  1283.  swap d4
  1284.  swap d5
  1285.  lsr.w #8,d5
  1286.  move.b d5,d4
  1287.  move.w d4,d6
  1288.  move.b (a2,d6.l),d7
  1289.  
  1290.  lsl.l #8,d7
  1291.  lsl.l #8,d2
  1292.  lsl.l #8,d3
  1293.  move.l d2,d4
  1294.  move.l d3,d5
  1295.  swap d4
  1296.  swap d5
  1297.  lsr.l #8,d5
  1298.  move.b d5,d4
  1299.  move.w d4,d6
  1300.  move.b (a2,d6.l),d7
  1301.  
  1302.  lsl.l #8,d7
  1303.  lsl.l #8,d2
  1304.  lsl.l #8,d3
  1305.  move.l d2,d4
  1306.  move.l d3,d5
  1307.  swap d4
  1308.  swap d5
  1309.  lsr.l #8,d5
  1310.  move.b d5,d4
  1311.  move.w d4,d6
  1312.  move.b (a2,d6.l),d7
  1313.  
  1314.  move.l d7,(a0)+
  1315.  
  1316.  dbra d1,.blurline
  1317.  
  1318.  add.w #(320-192),a1
  1319.  add.w #(320-192),a0
  1320.  dbra d0,.blurchunk
  1321.  
  1322.  endc
  1323.  
  1324.  ifeq LARGESCREEN
  1325.  
  1326.  move.l FASTBUFFER,a0 
  1327.  add.l #40*320+64,a0
  1328.  move.l #RAWSCRN,a1
  1329.  add.l #40*40+8,a1
  1330.  move.l #(24)-1,d0
  1331.  move.l #175,d1
  1332.  move.w #128,d2
  1333.  move.w #16,d3
  1334.  moveq #0,d4
  1335.  moveq #0,d5
  1336.  jsr CHUNKYTOPLANAR 
  1337. ; jsr    _c2p8_go
  1338.  
  1339.  endc
  1340.  
  1341.  ifne LARGESCREEN
  1342.  
  1343. ; move.l FASTBUFFER,a0 
  1344. ; move.l #RAWSCRN,a1
  1345. ; move.l #39,d0
  1346. ; move.l #255,d1
  1347. ; move.w #0,d2
  1348. ; move.w #0,d3
  1349. ; moveq #0,d4
  1350. ; moveq #0,d5
  1351. ; jsr CHUNKYTOPLANAR 
  1352.  
  1353.         lea    mybltnode(pc),a2    ; a2->mybltnode
  1354.         move.l    sysbase(pc),a6        ; a6->SysBase
  1355.         move.l    signals2-mybltnode(a2),d0
  1356.         jsr    _LVOWait(a6)
  1357.         
  1358.         lea    mybltnode(pc),a2
  1359.         move.l    signals2-mybltnode(a2),d0
  1360.         move.l    d0,d1
  1361.         move.l    sysbase(pc),a6    ; a6->SysBase
  1362.         jsr    _LVOSetSignal(a6)
  1363.  
  1364.     move.l #backupptr,a0
  1365.     
  1366.     move.l RAWPTR,d0
  1367.     move.l d0,(a0)+
  1368.     add.l #10240,d0
  1369.     move.l d0,(a0)+
  1370.     add.l #10240,d0
  1371.     move.l d0,(a0)+
  1372.     add.l #10240,d0
  1373.     move.l d0,(a0)+
  1374.     add.l #10240,d0
  1375.     move.l d0,(a0)+
  1376.     add.l #10240,d0
  1377.     move.l d0,(a0)+
  1378.     add.l #10240,d0
  1379.     move.l d0,(a0)+
  1380.     add.l #10240,d0
  1381.     move.l d0,(a0)+
  1382.     tst.b DONEANYTHING
  1383.     beq.s .NOTDONE
  1384.  
  1385.  move.l RAWPTR,d0
  1386.  move.l RAWPTR2,RAWPTR
  1387.  move.l d0,RAWPTR2
  1388.  
  1389. .NOTDONE:
  1390.  
  1391.  jsr    _c2p8_go
  1392.  
  1393.  
  1394.     move.b DONEANYTHING,lastDONEANYTHING
  1395.     move.b #0,DONEANYTHING
  1396.  
  1397.     move.l MyScreen,a0
  1398.     lea sc_BitMap(a0),a0
  1399.     lea bm_Planes(a0),a0
  1400.  
  1401.     move.l RAWPTR,d0
  1402.     move.l d0,(a0)+
  1403.     add.l #10240,d0
  1404.     move.l d0,(a0)+
  1405.     add.l #10240,d0
  1406.     move.l d0,(a0)+
  1407.     add.l #10240,d0
  1408.     move.l d0,(a0)+
  1409.     add.l #10240,d0
  1410.     move.l d0,(a0)+
  1411.     add.l #10240,d0
  1412.     move.l d0,(a0)+
  1413.     add.l #10240,d0
  1414.     move.l d0,(a0)+
  1415.     add.l #10240,d0
  1416.     move.l d0,(a0)+
  1417.     
  1418.     move.l _IntuitionBase,a6
  1419.     jsr _LVORemakeDisplay(a6)
  1420.     
  1421.     move.l    _GfxBase,a6
  1422.     jsr    _LVOWaitTOF(a6)
  1423.  
  1424.  endc
  1425.  
  1426.  bra SHOWNSCRN
  1427.  
  1428. DONEANYTHING: dc.w 0
  1429. lastDONEANYTHING: dc.w 0
  1430.  
  1431. SHOWSHADOW
  1432.  
  1433.  move.l #SHADOWBUFFER,a0
  1434.  add.l #40*256,a0
  1435.  move.l #RAWSCRN,a1
  1436.  add.l #40*40,a1
  1437.  move.l #(256/8)-1,d0
  1438.  move.l #175,d1
  1439.  move.w #0,d2
  1440.  move.w #8,d3
  1441.  moveq #0,d4
  1442.  moveq #0,d5
  1443.  jsr CHUNKYTOPLANAR 
  1444.  
  1445. SHOWNSCRN:
  1446.  
  1447.  ifne MOTIONBLUR
  1448.  
  1449.  move.l #fasty2,d1
  1450.  move.l FASTBUFFER,d0
  1451.  cmp.l #fasty,d0
  1452.  beq.s .ok2
  1453.  move.l #fasty,d1
  1454. .ok2:
  1455.  move.l d1,FASTBUFFER 
  1456.  
  1457.  endc
  1458.  
  1459.  move.l FASTBUFFER,a0
  1460.  move.l #NEBBIE,a1
  1461.  add.l #40*320+64,a0
  1462.  move.l #BLUR,a2
  1463.  moveq #0,d6
  1464.  
  1465.  move.w #175,d0
  1466. clrchunk:
  1467.  
  1468.  
  1469.  REPT 192/4
  1470.  move.l (a1)+,(a0)+
  1471.  endr
  1472.  
  1473.  add.w #(320-192),a0
  1474.  dbra d0,clrchunk
  1475.  
  1476.  move.l #SHADOWBUFFER,a0
  1477.  move.l #-1,d1
  1478.  move.l #-1,d2
  1479.  move.w #15,d0
  1480. ;clrshad:
  1481. ; move.w #15,d5
  1482. ;innner
  1483. ; move.l d2,(a0)+
  1484. ; move.l d2,(a0)+
  1485. ; move.l d2,(a0)+
  1486. ; move.l d2,(a0)+
  1487. ; move.l d1,(a0)+
  1488. ; move.l d1,(a0)+
  1489. ; move.l d1,(a0)+
  1490. ; move.l d1,(a0)+
  1491. ; move.l d2,(a0)+
  1492. ; move.l d2,(a0)+
  1493. ; move.l d2,(a0)+
  1494. ; move.l d2,(a0)+
  1495. ; move.l d1,(a0)+
  1496. ; move.l d1,(a0)+
  1497. ; move.l d1,(a0)+
  1498. ; move.l d1,(a0)+
  1499. ; move.l d2,(a0)+
  1500. ; move.l d2,(a0)+
  1501. ; move.l d2,(a0)+
  1502. ; move.l d2,(a0)+
  1503. ; move.l d1,(a0)+
  1504. ; move.l d1,(a0)+
  1505. ; move.l d1,(a0)+
  1506. ; move.l d1,(a0)+
  1507. ; move.l d2,(a0)+
  1508. ; move.l d2,(a0)+
  1509. ; move.l d2,(a0)+
  1510. ; move.l d2,(a0)+
  1511. ; move.l d1,(a0)+
  1512. ; move.l d1,(a0)+
  1513. ; move.l d1,(a0)+
  1514. ; move.l d1,(a0)+
  1515. ; move.l d2,(a0)+
  1516. ; move.l d2,(a0)+
  1517. ; move.l d2,(a0)+
  1518. ; move.l d2,(a0)+
  1519. ; move.l d1,(a0)+
  1520. ; move.l d1,(a0)+
  1521. ; move.l d1,(a0)+
  1522. ; move.l d1,(a0)+
  1523. ; move.l d2,(a0)+
  1524. ; move.l d2,(a0)+
  1525. ; move.l d2,(a0)+
  1526. ; move.l d2,(a0)+
  1527. ; move.l d1,(a0)+
  1528. ; move.l d1,(a0)+
  1529. ; move.l d1,(a0)+
  1530. ; move.l d1,(a0)+
  1531. ; move.l d2,(a0)+
  1532. ; move.l d2,(a0)+
  1533. ; move.l d2,(a0)+
  1534. ; move.l d2,(a0)+
  1535. ; move.l d1,(a0)+
  1536. ; move.l d1,(a0)+
  1537. ; move.l d1,(a0)+
  1538. ; move.l d1,(a0)+
  1539. ; move.l d2,(a0)+
  1540. ; move.l d2,(a0)+
  1541. ; move.l d2,(a0)+
  1542. ; move.l d2,(a0)+
  1543. ; move.l d1,(a0)+
  1544. ; move.l d1,(a0)+
  1545. ; move.l d1,(a0)+
  1546. ; move.l d1,(a0)+
  1547. ; dbra d5,innner
  1548. ; exg d1,d2
  1549. ;
  1550. ; dbra d0,clrshad
  1551.  
  1552.  
  1553.  
  1554.     btst #7,$bfe001
  1555.     beq.s exit_closescr
  1556.  
  1557.  
  1558.     add.l #$8000,lmxoff
  1559.     cmp.l #40*65536,lmxoff
  1560.     blt.s .oksm
  1561.     sub.l #40*65536,lmxoff    
  1562. .oksm
  1563.  
  1564.     bra loop
  1565.     
  1566. backupptr: ds.l 8
  1567.     
  1568. lmxoff: dc.l 0
  1569.  
  1570. exit_closescr
  1571.  
  1572.     move.l    4.w,a6
  1573.     move.l    SIG2,d0
  1574.     jsr    _LVOFreeSignal(a6)
  1575. nosig2:
  1576.     move.l    4.w,a6
  1577.     move.l    SIG1,d0
  1578.     jsr    _LVOFreeSignal(a6)
  1579. nosig1:
  1580.     move.l    CHIPBUF2,a1
  1581.     move.l    #scrwid*scrht/8,d0
  1582.     move.l    4.w,a6
  1583.     jsr    _LVOFreeMem(a6)
  1584. nochipbuf2:
  1585.     move.l    CHIPBUF1,a1
  1586.     move.l    #scrwid*scrht/8,d0
  1587.     move.l    4.w,a6
  1588.     jsr    _LVOFreeMem(a6)
  1589. nochipbuf1:
  1590.     move.l    CHUNKYCOMPARE,a1
  1591.     move.l    #scrwid*scrht/8,d0
  1592.     move.l    4.w,a6
  1593.     jsr    _LVOFreeMem(a6)
  1594. nochunkycomp:
  1595.  
  1596.     move.l    MyScreen(pc),a0
  1597.     CALLINT CloseScreen
  1598.  
  1599. exit_closeall
  1600.     move.l    _GfxBase(pc),a1
  1601.     CALLEXEC CloseLibrary
  1602.  
  1603. exit_closeint
  1604.     move.l    _IntuitionBase(pc),a1
  1605.     CALLEXEC CloseLibrary
  1606.  
  1607. exit_false
  1608.     move.l    #0,d0                return code
  1609.     rts
  1610.  
  1611.     include "work:charles/cpublitter/c2p8.s"
  1612.  
  1613. TESTTAB: ds.w 30
  1614.  
  1615. ************************************************
  1616. * SUBROUTINES HERE. ****************************
  1617. ************************************************
  1618.  
  1619.  
  1620. **********************************************************
  1621.  
  1622. * the definition of the screen - note that in assembler you
  1623. * MUST get the sizes of these fields correct, by consulting either
  1624. * the RKM or the header files
  1625.  
  1626.  
  1627. MyNewScreen    dc.w    0,0        left, top
  1628.         dc.w    320,256        width, height
  1629.         dc.w    8        depth
  1630.         dc.b    0,1        pens
  1631.         dc.w    0        viewmodes
  1632.         dc.w    CUSTOMSCREEN    type
  1633.         dc.l    MyFont        font
  1634.         dc.l    screen_title    title
  1635.         dc.l    0        gadgets
  1636.         dc.l    0        bitmap
  1637.  
  1638. * my font definition
  1639. MyFont    dc.l    font_name
  1640.     dc.w    TOPAZ_SIXTY
  1641.     dc.b    FS_NORMAL
  1642.     dc.b    FPF_ROMFONT
  1643.  
  1644. * the variables
  1645. _IntuitionBase    dc.l    0        Intuition lib pointer
  1646. _GfxBase    dc.l    0        graphics lib pointer
  1647. MyScreen        dc.l    0
  1648. MyWindow        dc.l    0
  1649. MyNewWindow    ds.b    nw_SIZE        a buffer
  1650.  
  1651.  
  1652. * some strings
  1653. int_name    INTNAME
  1654. graf_name    GRAFNAME
  1655. hello_message    dc.b    'Hello World'
  1656.  
  1657. * these are C strings, so have to be null terminated
  1658. screen_title    dc.b    'My Own Screen',0
  1659. font_name    dc.b    'topaz.font',0
  1660. window_title    dc.b    'A Simple Window',0
  1661.  
  1662.  even
  1663.  
  1664.  
  1665. doaSHADEpoly:
  1666.  
  1667.  move.w (a1)+,d7    ; sides to draw
  1668.  addq #2,a1        ; avoid holes
  1669.  
  1670.  move.l #SHADOWPTS,a3
  1671.  
  1672.  move.w (a1),d0
  1673.  move.w 4(a1),d1
  1674.  move.w 8(a1),d2
  1675.  muls #10,d0
  1676.  muls #10,d1
  1677.  muls #10,d2
  1678.  move.w 8(a3,d0.w),d3
  1679.  move.w 8(a3,d1.w),d4
  1680.  move.w 8(a3,d2.w),d5
  1681.  move.l (a3,d0.w),d0
  1682.  move.l (a3,d1.w),d1
  1683.  move.l (a3,d2.w),d2
  1684.  asr.l #8,d0
  1685.  asr.l #8,d1
  1686.  asr.l #8,d2
  1687.  asr.l #1,d0
  1688.  asr.l #1,d1
  1689.  asr.l #1,d2
  1690.  
  1691.  sub.w d1,d0
  1692.  sub.w d1,d2
  1693.  sub.w d4,d3
  1694.  sub.w d4,d5
  1695.  muls d3,d2
  1696.  muls d5,d0
  1697.  sub.l d0,d2
  1698.  bge SHADpolybehind
  1699.  
  1700.  
  1701.  
  1702.  move.w #20000,d4    ; top
  1703.  move.w #-20000,d5    ; bottom
  1704.  move.l #UVCOORDS,a4
  1705.  
  1706. putinlinesSHAD:
  1707.  move.w (a1),d0
  1708.  move.w 4(a1),d1
  1709.  
  1710.  moveq #0,d2
  1711.  move.b 2(a1),d2    ; one end U
  1712.  move.w d2,2(a4,d0.w*4)
  1713.  move.b 3(a1),d2    ; one end V
  1714.  move.w d2,(a4,d0.w*4)
  1715.  move.b 6(a1),d2    ; two end U
  1716.  move.w d2,2(a4,d1.w*4)
  1717.  move.b 7(a1),d2    ; two end V
  1718.  move.w d2,(a4,d1.w*4)
  1719.  
  1720.  move.w d0,d2
  1721.  muls #10,d2
  1722.  move.w 8(a3,d2.w),d2    ; Z
  1723.  
  1724.  cmp.w d2,d4
  1725.  ble.s .oktop
  1726.  move.w d2,d4
  1727. .oktop
  1728.  cmp.w d2,d5
  1729.  bge.s .okbot
  1730.  move.w d2,d5
  1731. .okbot
  1732.  
  1733.  movem.l d4/d5/d7/a1/a3/a4,-(a7)
  1734.  bsr SIMPLESHADLINE
  1735.  movem.l (a7)+,d4/d5/d7/a1/a3/a4
  1736.  addq #4,a1
  1737.  dbra d7,putinlinesSHAD
  1738.  addq #4,a1
  1739.   
  1740.  move.w (a1)+,TEXTUREADD
  1741.  
  1742.  asr.w #2,d4
  1743.  asr.w #2,d5
  1744.  add.w #128,d4
  1745.  add.w #128,d5
  1746.  move.w d4,TOPLINE
  1747.  move.w d5,BOTLINE
  1748.  
  1749. * Now draw the shadow polygon....
  1750.  
  1751.  move.l #SHADOWBUFFER,a2
  1752.  move.l #LEFTUVS,a0
  1753.  move.w TOPLINE,d0
  1754.  move.w BOTLINE,d1
  1755.  sub.w d0,d1
  1756.  asl.w #3,d0
  1757.  add.w d0,a0
  1758.  muls #(512/8),d0
  1759.  add.l d0,a2    ; pointer to screen line.
  1760.  
  1761.  subq #1,d1
  1762.  blt NOPOLYGONSHAD
  1763.  
  1764. DOAHORLINESHAD:
  1765.  swap d1
  1766.  
  1767.  move.w RIGHTUVS-LEFTUVS(a0),d0
  1768.  move.w (a0)+,d7
  1769.  sub.w d7,d0
  1770.  blt NOPOLYGONSHAD
  1771.  
  1772.  move.l a2,-(a7)
  1773.  
  1774. ; asr.w #2,d0
  1775. ; asr.w #2,d7
  1776.  lea (a2,d7.w*2),a2
  1777.  ext.l d0
  1778.  addq #1,d0
  1779.  
  1780.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1781.  move.w (a0)+,d4
  1782.  swap d7
  1783.  clr.w d7
  1784.  swap d4
  1785.  clr.w d4
  1786.  sub.l d4,d7
  1787.  divs.l d0,d7
  1788.  move.l d7,a5
  1789.  
  1790.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1791.  swap d7
  1792.  clr.w d7
  1793.  move.w (a0)+,d5
  1794.  swap d5
  1795.  clr.w d5
  1796.  sub.l d5,d7
  1797.  divs.l d0,d7
  1798.  move.l d7,a6
  1799.  
  1800.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1801.  swap d7
  1802.  clr.w d7
  1803.  move.w (a0)+,d6
  1804.  swap d6
  1805.  clr.w d6
  1806.  sub.l d6,d7
  1807.  divs.l d0,d7
  1808.  move.l d7,a3
  1809.  
  1810.  move.l a0,-(a7)
  1811.  move.l d1,-(a7)
  1812.  move.l #TEXTURES,a0
  1813.  move.w TEXTUREADD,d7
  1814.  bge.s .okaddtes3
  1815.  and.w #$7fff,d7
  1816.  add.l #65536*4,a0
  1817. .okaddtes3:
  1818.  ext.l d7
  1819. ; add.l d7,d7
  1820.  asl.l #8,d7
  1821.  add.l d7,a0
  1822.  move.w #0,d7
  1823.  
  1824.  subq #1,d0
  1825.  
  1826. ; d0=xdist
  1827. ; d4=U  a5=DU
  1828. ; d5=V  a6=DV
  1829. ; d6=Y  a3=DY
  1830.  moveq #0,d1
  1831.  
  1832.  swap d6
  1833.  
  1834. PLOTADOT:
  1835.  
  1836. .across
  1837.  
  1838. ; swap d4
  1839. ; swap d5
  1840. ; move.w d4,d2
  1841. ; lsl.w #8,d2
  1842. ; swap d4
  1843. ; move.b d5,d2
  1844. ; add.l a5,d4
  1845. ; swap d5
  1846. ; add.l a6,d5
  1847.  
  1848.  
  1849. ; swap d6
  1850. ; move.b (a2)+,d1
  1851. ; tst.b 1(a0,d2.w*8)
  1852. ; beq.s .noplottt
  1853.  move.b d6,(a2)
  1854.  addq #2,a2
  1855.  
  1856.  dbra d0,.across
  1857.  bra.s .plaster
  1858.  
  1859. .noplottt:
  1860.  addq #1,a2
  1861.  dbra d0,.across
  1862.  
  1863. .plaster:
  1864.  
  1865.  move.l (a7)+,d1
  1866.  move.l (a7)+,a0
  1867.  move.l (a7)+,a2
  1868.  
  1869. .noline:
  1870.  add.w #512,a2
  1871.  
  1872.  swap d1
  1873.  dbra d1,DOAHORLINESHAD
  1874.  
  1875. NOPOLYGONSHAD:
  1876.  
  1877. SHADpolybehind:
  1878.  rts
  1879.  
  1880.  
  1881. ************************************************
  1882.  
  1883. LU: dc.w 0
  1884. LV: dc.w 0
  1885. RU: dc.w 0
  1886. RV: dc.w 0
  1887.     
  1888. SIMPLESHADLINE:
  1889.  move.l #SHADOWPTS,a1
  1890.  
  1891.  move.l #UVCOORDS,a2
  1892.  move.w (a2,d0.w*4),LU
  1893.  move.w 2(a2,d0.w*4),LV
  1894.  move.w (a2,d1.w*4),RU
  1895.  move.w 2(a2,d1.w*4),RV
  1896.  
  1897.  muls #10,d0
  1898.  muls #10,d1
  1899.  move.w 8(a1,d0.w),d2        ;fz
  1900.  move.w 8(a1,d1.w),d7        ;sz
  1901.  ext.l d2
  1902.  ext.l d7
  1903.  
  1904.  move.l #LEFTUVS,a3
  1905.  asr.l #2,d2
  1906.  asr.l #2,d7
  1907.  cmp.l d2,d7 
  1908.  beq .noline
  1909.  
  1910.  bgt.s .lineonright
  1911. .lineonleft:
  1912.  move.l #RIGHTUVS,a3
  1913.  exg d0,d1
  1914.  exg d2,d7
  1915.  
  1916.  move.l LU,d5
  1917.  move.l RU,LU
  1918.  move.l d5,RU
  1919.  
  1920. .lineonright:
  1921.  
  1922.  sub.w d2,d7
  1923.  add.w #128,d2
  1924.  lea (a3,d2.w*8),a3
  1925.  
  1926.  move.w d7,YDIFF
  1927.  
  1928.  move.l (a1,d0.w),d3        ;fx
  1929.  move.l (a1,d1.w),d7        ;sx
  1930.  
  1931.  asl.l #5,d3
  1932.  asl.l #5,d7
  1933.  
  1934.  sub.l d3,d7
  1935.  divs.l YDIFF-2,d7
  1936.  move.l d7,a0    ; dx
  1937.  
  1938.  move.l #ROTATEDPTS,a1
  1939.  
  1940.  move.w LU,d4
  1941.  move.w LV,d5
  1942.  move.w RU,d6
  1943.  move.w RV,d7
  1944.  
  1945.  sub.w d4,d6
  1946.  sub.w d5,d7
  1947.  swap d4
  1948.  swap d5
  1949.  clr.w d4
  1950.  clr.w d5
  1951.  swap d6
  1952.  swap d7
  1953.  clr.w d6
  1954.  clr.w d7
  1955.  
  1956.  divs.l YDIFF-2,d6
  1957.  divs.l YDIFF-2,d7
  1958.  
  1959.  move.l d6,a4
  1960.  move.l d7,a5
  1961.  
  1962. ; asl.w #4,d0
  1963. ; asl.w #4,d1
  1964.  
  1965.  move.l 4(a1,d0.w),d6
  1966.  move.l 4(a1,d1.w),d7
  1967.  asl.l #5,d6
  1968.  asl.l #5,d7
  1969.  sub.l d6,d7
  1970.  divs.l YDIFF-2,d7
  1971.  exg d7,a6
  1972.  exg d7,d6
  1973.  
  1974.  move.l YDIFF-2,d1
  1975.  subq #1,d1
  1976.  
  1977. ; d3=x a0=dx
  1978. ; d4=u a4=du
  1979. ; d5=v a5=dv
  1980. ; d7=y a6=dy
  1981. ; d1=dz
  1982.  
  1983.  move.w HIGHPOLY,d7
  1984.  
  1985.  add.l #128*65536,d3
  1986. ; add.l #128*65536,d7
  1987.  
  1988. .PUTINLINE:
  1989.  swap d3
  1990.  move.w d3,(a3)+
  1991.  swap d3
  1992.  add.l a0,d3
  1993.  swap d4
  1994.  move.w d4,(a3)+
  1995.  swap d4
  1996.  swap d5
  1997.  add.l a4,d4
  1998.  move.w d5,(a3)+
  1999.  swap d5
  2000.  add.l a5,d5
  2001. ; swap d7
  2002.  move.w d7,(a3)+
  2003. ; swap d7
  2004. ; add.l a6,d7
  2005.  dbra d1,.PUTINLINE
  2006.  
  2007. .noline:
  2008.  rts
  2009.  
  2010. BCOS: dc.w 0
  2011. BSIN: dc.w 0
  2012. ACOS: dc.w 0
  2013. ASIN: dc.w 0
  2014.  
  2015. CCOS: dc.w 0
  2016. CSIN: dc.w 0
  2017. DCOS: dc.w 0
  2018. DSIN: dc.w 0
  2019. ECOS: dc.w 0
  2020. ESIN: dc.w 0
  2021.  
  2022. FSX: dc.w 0
  2023. FSY: dc.w 0
  2024. SSX: dc.w 0
  2025. SSY: dc.w 0
  2026.  
  2027. **************************************************
  2028.  
  2029. doapoly:
  2030.  
  2031.  move.w (a1)+,d7    ; sides to draw
  2032.  addq #2,a1        ; avoid holes
  2033.  move.w 12(a1,d7.w*4),pregour
  2034.  
  2035.  move.l #ONSCREENPTS,a3
  2036.  
  2037.  move.w (a1),d0
  2038.  move.w 4(a1),d1
  2039.  move.w 8(a1),d2
  2040.  move.w 2(a3,d0.w*4),d3
  2041.  move.w 2(a3,d1.w*4),d4
  2042.  move.w 2(a3,d2.w*4),d5
  2043.  move.w (a3,d0.w*4),d0
  2044.  move.w (a3,d1.w*4),d1
  2045.  move.w (a3,d2.w*4),d2
  2046.  
  2047.  sub.w d1,d0
  2048.  sub.w d1,d2
  2049.  sub.w d4,d3
  2050.  sub.w d4,d5
  2051.  muls d3,d2
  2052.  muls d5,d0
  2053.  sub.l d0,d2
  2054.  ble polybehind
  2055.  
  2056. ; Now we must rotate the polygons coordinates in
  2057. ; the specular map so that the texturemap is vertical
  2058. ; relative to the specular map and so that bump-
  2059. ; mapping can take place unerroneously!
  2060.  
  2061. ; movem.l d0-d7/a0-a6,-(a7)
  2062.  
  2063.  move.w #0,BCOS
  2064.  move.w #128*128,ACOS
  2065.  move.w #0,BSIN
  2066.  move.w #0,ASIN
  2067.  
  2068.  moveq #0,d3
  2069.  move.b 2(a1),d3
  2070.  moveq #0,d4
  2071.  move.b 3(a1),d4
  2072.  moveq #0,d5
  2073.  move.b 2+4(a1),d5
  2074.  moveq #0,d6
  2075.  move.b 3+4(a1),d6
  2076.  
  2077.  sub.w d3,d5
  2078.  sub.w d4,d6
  2079.  
  2080.  move.w d5,d1
  2081.  move.w d6,d2
  2082.  muls d1,d1
  2083.  muls d2,d2
  2084.  add.l d1,d2
  2085.  jsr CALCSQROOT
  2086.  tst.w d2
  2087.  beq .NOROT
  2088.  
  2089.  ext.l d5
  2090.  ext.l d6
  2091.  asl.l #7,d5
  2092.  asl.l #7,d6
  2093.  divs d2,d5
  2094.  divs d2,d6
  2095.  move.w d5,ECOS
  2096.  move.w d6,ESIN
  2097.  
  2098.  move.w ECOS,d0
  2099.  asl.w #7,d0
  2100.  move.w d0,ACOS
  2101.  move.w ESIN,d0
  2102.  asl.w #7,d0
  2103.  move.w d0,ASIN
  2104.  
  2105.  move.l #SPECBRIGHTS,a3
  2106.  
  2107.  move.w (a1),d0
  2108.  moveq #0,d5
  2109.  moveq #0,d6
  2110.  move.b (a3,d0.w*4),d5
  2111.  move.b 1(a3,d0.w*4),d6
  2112.  move.w 4(a1),d0
  2113.  moveq #0,d3
  2114.  moveq #0,d4
  2115.  move.b (a3,d0.w*4),d3
  2116.  move.b 1(a3,d0.w*4),d4
  2117.  sub.w d5,d3
  2118.  sub.w d6,d4
  2119.  
  2120.  move.w d3,d1
  2121.  move.w d4,d2
  2122.  muls d1,d1
  2123.  muls d2,d2
  2124.  add.l d1,d2
  2125.  jsr CALCSQROOT
  2126.  tst.w d2
  2127.  beq .NOROT1
  2128.  
  2129.  ext.l d3
  2130.  asl.l #7,d3
  2131.  ext.l d4
  2132.  asl.l #7,d4
  2133.  divs d2,d3
  2134.  divs d2,d4
  2135.  move.w d3,BCOS
  2136.  neg.w d4
  2137.  move.w d4,BSIN
  2138.  
  2139.  move.w ECOS,d4
  2140.  move.w ESIN,d5
  2141.  move.w d4,d2
  2142.  move.w d5,d3
  2143.  muls BCOS,d2
  2144.  muls BSIN,d3
  2145.  sub.l d3,d2
  2146.  muls BSIN,d4
  2147.  muls BCOS,d5
  2148.  add.l d5,d4
  2149.  move.w d2,ACOS
  2150.  move.w d4,ASIN
  2151.  
  2152. .NOROT1
  2153.  
  2154.  move.w #0,DCOS
  2155.  move.w #0,DSIN
  2156.  move.w ECOS,d0
  2157.  asl.w #7,d0
  2158.  move.w d0,CCOS
  2159.  move.w ESIN,d0
  2160.  asl.w #7,d0
  2161.  move.w d0,CSIN
  2162.  
  2163. ; bra .NOROT
  2164.  
  2165. ; First calculate angle B
  2166.  
  2167.  move.l #NORMBRIGHTS,a3
  2168.  
  2169.  movem.l d7/a1,-(a7)
  2170.  
  2171. .findnonzer:
  2172.  
  2173.  move.w (a1),d0
  2174.  moveq #0,d5
  2175.  moveq #0,d6
  2176.  move.b (a3,d0.w*2),d5
  2177.  move.b 1(a3,d0.w*2),d6
  2178.  move.w 4(a1),d0
  2179.  moveq #0,d3
  2180.  moveq #0,d4
  2181.  move.b (a3,d0.w*2),d3
  2182.  move.b 1(a3,d0.w*2),d4
  2183.  sub.w d5,d3
  2184.  sub.w d6,d4
  2185.  bne.s .okok
  2186.  tst.w d3
  2187.  bne.s .okok
  2188.  
  2189.  addq #4,a1
  2190.  
  2191.  dbra d7,.findnonzer
  2192.  
  2193.  movem.l (a7)+,d7/a1
  2194.  bra .NOROT
  2195.  
  2196. .okok:
  2197.  
  2198.  moveq #0,d3
  2199.  move.b 2(a1),d3
  2200.  moveq #0,d4
  2201.  move.b 3(a1),d4
  2202.  moveq #0,d5
  2203.  move.b 2+4(a1),d5
  2204.  moveq #0,d6
  2205.  move.b 3+4(a1),d6
  2206.  
  2207.  sub.w d3,d5
  2208.  sub.w d4,d6
  2209.  
  2210.  move.w d5,d1
  2211.  move.w d6,d2
  2212.  muls d1,d1
  2213.  muls d2,d2
  2214.  add.l d1,d2
  2215.  jsr CALCSQROOT
  2216.  tst.w d2
  2217.  beq .NOROT8
  2218.  
  2219.  ext.l d5
  2220.  ext.l d6
  2221.  asl.l #7,d5
  2222.  asl.l #7,d6
  2223.  divs d2,d5
  2224.  divs d2,d6
  2225.  move.w d5,ECOS
  2226.  neg.w d6
  2227.  move.w d6,ESIN
  2228.  move.w ECOS,d0
  2229.  asl.w #7,d0
  2230.  move.w d0,CCOS
  2231.  move.w ESIN,d0
  2232.  asl.w #7,d0
  2233.  neg.w d0
  2234.  move.w d0,CSIN
  2235.  
  2236. .NOROT8:
  2237.  
  2238.  movem.l (a7)+,d7/a1
  2239.  
  2240.  move.w d3,d1
  2241.  move.w d4,d2
  2242.  muls d1,d1
  2243.  muls d2,d2
  2244.  add.l d1,d2
  2245.  jsr CALCSQROOT
  2246.  tst.w d2
  2247.  beq .NOROT
  2248.  
  2249.  ext.l d3
  2250.  asl.l #7,d3
  2251.  ext.l d4
  2252.  asl.l #7,d4
  2253.  divs d2,d3
  2254.  divs d2,d4
  2255.  move.w d3,DCOS
  2256.  neg.w d4
  2257.  move.w d4,DSIN
  2258.  
  2259.  move.w ECOS,d4
  2260.  move.w ESIN,d5
  2261.  move.w d4,d2
  2262.  move.w d5,d3
  2263.  muls DCOS,d2
  2264.  muls DSIN,d3
  2265.  sub.l d3,d2
  2266.  muls DSIN,d4
  2267.  muls DCOS,d5
  2268.  add.l d5,d4
  2269.  move.w d2,CCOS
  2270.  move.w d4,CSIN
  2271.  
  2272.  
  2273. .NOROT:
  2274.  
  2275. ; movem.l (a7)+,d0-d7/a0-a6
  2276.  
  2277.  move.l #ONSCREENPTS,a3
  2278.  
  2279.  move.w #20000,d4    ; top
  2280.  move.w #-20000,d5    ; bottom
  2281.  move.l #UVCOORDS,a4
  2282.  
  2283.  move.l a1,a0
  2284.  
  2285. putinlines:
  2286.  move.w (a1),d0
  2287.  move.w 4(a1),d1
  2288.  
  2289.  moveq #0,d2
  2290.  move.b 2(a1),d2    ; one end U
  2291.  move.w d2,2(a4,d0.w*4)
  2292.  move.b 3(a1),d2    ; one end V
  2293.  move.w d2,(a4,d0.w*4)
  2294.  move.b 6(a1),d2    ; two end U
  2295.  move.w d2,2(a4,d1.w*4)
  2296.  move.b 7(a1),d2    ; two end V
  2297.  move.w d2,(a4,d1.w*4)
  2298.  
  2299.  move.w 2(a3,d0.w*4),d2    ; Z
  2300.  
  2301.  cmp.w d2,d4
  2302.  ble.s .oktop
  2303.  move.w d2,d4
  2304. .oktop
  2305.  cmp.w d2,d5
  2306.  bge.s .okbot
  2307.  move.w d2,d5
  2308. .okbot
  2309.  
  2310.  movem.l a0/d4/d5/d7/a1/a3/a4,-(a7)
  2311.  jsr SIMPLECALCLINE
  2312.  movem.l (a7)+,a0/d4/d5/d7/a1/a3/a4
  2313.  addq #4,a1
  2314.  dbra d7,putinlines
  2315.  addq #4,a1 
  2316.  
  2317.  move.w (a1)+,TEXTUREADD
  2318.  
  2319.  asr.w #2,d4
  2320.  asr.w #2,d5
  2321. ; add.w #128,d4
  2322. ; add.w #128,d5
  2323.  move.w d4,TOPLINE
  2324.  move.w d5,BOTLINE
  2325.   
  2326.  move.l #SHADOWPTS,a1
  2327.  move.w (a0),d0
  2328.  move.w 4(a0),d1
  2329.  move.w 8(a0),d2
  2330.  
  2331. CHECKVALS:
  2332.  
  2333.  muls #10,d0
  2334.  muls #10,d1
  2335.  muls #10,d2
  2336.  
  2337.  lea (a1,d0.w),a0
  2338.  lea (a1,d2.w),a2
  2339.  lea (a1,d1.w),a1
  2340.  
  2341.  move.l (a0),d3
  2342.  sub.l (a1),d3
  2343.  asr.l #8,d3
  2344.  asr.l #1,d3
  2345.  move.l 4(a0),d4
  2346.  sub.l 4(a1),d4
  2347.  asr.l #8,d4
  2348.  asr.l #1,d4
  2349.  move.w 8(a0),d5
  2350.  sub.w 8(a1),d5
  2351.  
  2352.  move.w d3,d6
  2353.  muls d6,d6
  2354.  move.w d4,d7
  2355.  muls d7,d7
  2356.  add.l d7,d6
  2357.  move.w d5,d7
  2358.  muls d7,d7
  2359.  add.l d7,d6
  2360.  move.l d6,d2
  2361.  jsr CALCSQROOT
  2362.  move.w d2,LEN1
  2363.  
  2364.  move.l (a2),d0
  2365.  sub.l (a1),d0
  2366.  asr.l #8,d0
  2367.  asr.l #1,d0
  2368.  move.l 4(a2),d1
  2369.  sub.l 4(a1),d1
  2370.  asr.l #8,d1
  2371.  asr.l #1,d1
  2372.  move.w 8(a2),d2
  2373.  sub.w 8(a1),d2
  2374.  
  2375.  muls d2,d3
  2376.  muls d0,d5
  2377.  sub.l d3,d5    ; length
  2378.  muls.l #$4c,d5
  2379.  
  2380.  muls d0,d0
  2381.  muls d1,d1
  2382.  muls d2,d2
  2383.  add.l d0,d1
  2384.  add.l d1,d2
  2385.  jsr CALCSQROOT
  2386.  
  2387.  muls LEN1,d2
  2388.  bgt.s .ok
  2389.  moveq #1,d2
  2390. .ok
  2391.  
  2392.  divs.l d2,d5
  2393.  
  2394.  add.l #16,d5
  2395.  
  2396.  tst.l d5
  2397.  ble.s .okbr
  2398.  moveq #0,d5
  2399. .okbr:
  2400.  add.w #$5c,d5
  2401.  bge.s .okbr2
  2402.  moveq #0,d5
  2403. .okbr2:
  2404.  
  2405.  move.w d5,d0
  2406.  
  2407.  asl.w #8,d5
  2408.  move.w d5,BRIGHTNESS+2
  2409.  
  2410.  sub.w #$5c,d0
  2411.  asr.w #1,d0
  2412.  add.w #$5c,d0
  2413.  asl.w #8,d0
  2414.  move.w d0,BRIGHTNESS
  2415.  
  2416.  
  2417. ***********************************************
  2418. * Draw the polygon (shadowed).
  2419.  
  2420.  move.l FASTBUFFER,a2
  2421.  move.l #LEFTUVS,a0
  2422.  move.w TOPLINE,d0
  2423.  move.w BOTLINE,d1
  2424.  sub.w d0,d1
  2425.  move.w d0,d2
  2426.  muls #20,d2
  2427.  add.l d2,a0
  2428.  muls #320,d0
  2429.  add.l d0,a2    ; pointer to screen line.
  2430.  
  2431.  subq #1,d1
  2432.  blt NOPOLYGON
  2433.  
  2434.  tst.b Gouraud
  2435.  bne GOURPOLY
  2436.  
  2437. DOAHORLINE:
  2438.  swap d1
  2439.  
  2440.  move.w RIGHTUVS-LEFTUVS(a0),d0
  2441.  move.w (a0)+,d7
  2442.  asr.w #2,d0
  2443.  asr.w #2,d7
  2444.  sub.w d7,d0
  2445.  bge.s .okflibble
  2446.  
  2447.  add.w #14,a0
  2448.  add.w #320,a2
  2449.  swap d1
  2450.  dbra d1,DOAHORLINE
  2451.  bra NOPOLYGON
  2452.  
  2453. .okflibble:
  2454.  
  2455.  move.l a2,-(a7)
  2456.  
  2457.  add.w d7,a2
  2458.  ext.l d0
  2459.  addq #1,d0
  2460.  
  2461.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2462.  move.l (a0)+,d2 
  2463.  sub.l d2,d7
  2464.  divs.l d0,d7
  2465.  move.l d7,a1
  2466.  
  2467.  
  2468.  
  2469.  
  2470.  
  2471.  
  2472.  
  2473.  
  2474.  
  2475.  
  2476.  
  2477.  
  2478.  
  2479.  
  2480.  
  2481.  
  2482.  
  2483.  
  2484.  move.l RIGHTUVS-LEFTUVS(a0),d7 
  2485.  move.l (a0)+,d3 
  2486.  
  2487.  
  2488.  
  2489.  
  2490.  
  2491.  
  2492.  
  2493.  
  2494.  
  2495.  
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.  
  2504.  
  2505.  
  2506.  sub.l d3,d7
  2507.  divs.l d0,d7
  2508.  move.l d7,a4
  2509.  
  2510.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2511.  move.w (a0)+,d4
  2512.  swap d7
  2513.  clr.w d7
  2514.  swap d4
  2515.  clr.w d4
  2516.  sub.l d4,d7
  2517.  divs.l d0,d7
  2518.  move.l d7,a5
  2519.  
  2520.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2521.  swap d7
  2522.  clr.w d7
  2523.  move.w (a0)+,d5
  2524.  swap d5
  2525.  clr.w d5
  2526.  sub.l d5,d7
  2527.  divs.l d0,d7
  2528.  move.l d7,a6
  2529.  
  2530.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2531.  swap d7
  2532.  clr.w d7
  2533.  move.w (a0)+,d6
  2534.  swap d6
  2535.  clr.w d6
  2536.  sub.l d6,d7
  2537.  divs.l d0,d7
  2538.  move.l d7,a3
  2539.  
  2540.  move.l a0,-(a7)
  2541.  move.l d1,-(a7)
  2542.  move.l #TEXTURES,a0
  2543.  move.w TEXTUREADD,d7
  2544.  bge.s .okaddtes3
  2545.  and.w #$7fff,d7
  2546.  add.l #65536*4,a0
  2547. .okaddtes3:
  2548.  ext.l d7
  2549. ; add.l d7,d7
  2550.  asl.l #8,d7
  2551.  add.l d7,a0
  2552.  move.w #0,d7
  2553.  
  2554.  move.l BRIGHTNESS,a6
  2555.  
  2556.  move.l a7,SAVESTACK
  2557.  move.l #SHADOWBUFFER,a7
  2558.  
  2559.  subq #1,d0
  2560.  
  2561. ; d0=xdist
  2562. ; d2=U    a1=DU
  2563. ; d3=V  a4=DV
  2564. ; d4=X  a5=DX
  2565. ; d5=Y  a6=DY
  2566. ; d6=Z  a3=DZ
  2567.  move.w HIGHPOLY,d5
  2568.  
  2569.  moveq #0,d1
  2570.  swap d6
  2571.  move.w d6,d1
  2572.  lsl.w #8,d1
  2573.  swap d4
  2574.  move.b d4,d1
  2575.  swap d4
  2576.  swap d6
  2577.  
  2578.  moveq #0,d7
  2579.  move.b (a7,d1.l),d7
  2580.  cmp.w d7,d5
  2581.  ble INTHELIGHT
  2582.  bra.s INTHEDARK
  2583.  
  2584. PENUMBRA:
  2585.  moveq #0,d1
  2586.  swap d6
  2587.  move.w d6,d1
  2588.  lsl.w #8,d1
  2589.  swap d4
  2590.  move.b d4,d1
  2591.  swap d4
  2592.  swap d6
  2593.  add.l a5,d4
  2594.  add.l a3,d6
  2595.  
  2596.      moveq #0,d7
  2597.  move.b (a7,d1.l),d7
  2598.  cmp.w d7,d5
  2599.  ble INTOLIGHT
  2600.  bra.s INTODARK
  2601.  
  2602.  
  2603. INTHEDARK:
  2604.  moveq #0,d1
  2605.  swap d6
  2606.  move.w d6,d1
  2607.  lsl.w #8,d1
  2608.  swap d4
  2609.  move.b d4,d1
  2610.  swap d4
  2611.  swap d6
  2612.  add.l a5,d4
  2613.  add.l a3,d6
  2614.  
  2615.  moveq #0,d7
  2616.  move.b (a7,d1.l),d7
  2617.  cmp.w d7,d5
  2618.  ble.s INTOPENUM
  2619. INTODARK:
  2620.  move.w #$5c00,d7
  2621.  swap d2
  2622.  move.w d2,d1
  2623.  asl.w #8,d1
  2624.  swap d3
  2625.  move.b d3,d1
  2626.  swap d2
  2627.  swap d3
  2628.  add.l a1,d2
  2629.  add.l a4,d3
  2630.  
  2631. ; move.b (a0,d1.w*4),d7
  2632. ; beq.s .noplottt
  2633.  
  2634.  move.b TEXTUREPAL-256(pc,d7.w),(a2)+
  2635.  dbra d0,INTHEDARK
  2636.  bra.s PASTAC 
  2637.  
  2638. .noplottt
  2639.  addq #1,a2
  2640.  dbra d0,INTHEDARK
  2641.  bra.s PASTAC
  2642.  
  2643. INTOPENUM:
  2644.  move.l a6,d7
  2645.  swap d7
  2646.  swap d2
  2647.  move.w d2,d1
  2648.  asl.w #8,d1
  2649.  swap d3
  2650.  move.b d3,d1
  2651.  swap d2
  2652.  swap d3
  2653.  add.l a1,d2
  2654.  add.l a4,d3
  2655.  
  2656. ; move.b (a0,d1.w*4),d7
  2657. ; beq.s .noplottt
  2658.  
  2659.  move.b TEXTUREPAL(pc,d7.w),(a2)+
  2660.  dbra d0,PENUMBRA
  2661.  bra.s PASTAC 
  2662.  
  2663. .noplottt
  2664.  addq #1,a2
  2665.  dbra d0,PENUMBRA
  2666.  bra.s PASTAC
  2667.  
  2668. INTHELIGHT:
  2669.  
  2670.  moveq #0,d1
  2671.  swap d6
  2672.  move.w d6,d1
  2673.  lsl.w #8,d1
  2674.  swap d4
  2675.  move.b d4,d1
  2676.  swap d4
  2677.  swap d6
  2678.  add.l a5,d4
  2679.  add.l a3,d6
  2680.  
  2681.  moveq #0,d7
  2682.  move.b (a7,d1.l),d7
  2683.  cmp.w d7,d5
  2684.  bgt.s INTOPENUM
  2685. INTOLIGHT:
  2686.  move.w a6,d7
  2687.  swap d2
  2688.  move.w d2,d1
  2689.  asl.w #8,d1
  2690.  swap d3
  2691.  move.b d3,d1
  2692.  swap d2
  2693.  swap d3
  2694.  add.l a1,d2
  2695.  add.l a4,d3
  2696.  
  2697. ; move.b (a0,d1.w*4),d7
  2698. ; beq.s .noplottt
  2699.  
  2700.  move.b TEXTUREPAL(pc,d7.w),(a2)+
  2701.  dbra d0,INTHELIGHT
  2702.  bra.s PASTAC 
  2703.  
  2704. .noplottt:
  2705.  addq #1,a2
  2706.  dbra d0,INTHELIGHT
  2707.  
  2708. PASTAC
  2709.  
  2710.  move.l SAVESTACK,a7
  2711.  
  2712.  move.l (a7)+,d1
  2713.  move.l (a7)+,a0
  2714.  move.l (a7)+,a2
  2715.  
  2716. .noline:
  2717.  add.w #320,a2
  2718.  
  2719.  swap d1
  2720.  dbra d1,DOAHORLINE
  2721.  
  2722. NOPOLYGON:
  2723. polybehind:
  2724.  rts
  2725.  
  2726. TEXTUREPAL:
  2727.  
  2728. SAVESTACK: dc.l 0
  2729. HIGHPOLY: dc.w 0
  2730. LEN1: dc.w 0
  2731. BRIGHTNESS: dc.l 0
  2732. TRANSTEXT: dc.w 0
  2733. AANG: dc.w 0
  2734. BANG: dc.w 0
  2735. CANG: dc.w 0
  2736. DANG: dc.w 0
  2737.  
  2738.  include "ab3:print.s"
  2739.  
  2740.  temp: dc.w 0
  2741.  
  2742. GOURPOLY: 
  2743.  
  2744. DOAHORLINEGOUR:
  2745.  swap d1
  2746.  
  2747.  ifeq SHADING
  2748.  move.w #128,16(a0)
  2749.  move.w #128,16+RIGHTUVS-LEFTUVS(a0)
  2750.  move.w #128,4+RIGHTUVS-LEFTUVS(a0)
  2751.  move.w #128,4(a0)
  2752.  endc
  2753.  
  2754.  move.w RIGHTUVS-LEFTUVS(a0),d0
  2755.  move.w (a0)+,d7
  2756.  asr.w #2,d0
  2757.  asr.w #2,d7
  2758.  sub.w d7,d0
  2759.  bge.s .okflibble
  2760.  
  2761.  add.w #18,a0
  2762.  add.w #320,a2
  2763.  swap d1
  2764.  dbra d1,DOAHORLINEGOUR
  2765.  bra NOPOLYGON
  2766.  
  2767. .okflibble:
  2768.  
  2769.  move.l a2,-(a7)
  2770.  
  2771.  add.w d7,a2
  2772.  ext.l d0
  2773.  addq #1,d0
  2774.  
  2775.  move.b RIGHTUVS-LEFTUVS(a0),d3
  2776.  move.b (a0),d2
  2777.  
  2778.  ext.w d3
  2779.  ext.w d2
  2780.  
  2781.  tst.w d2
  2782.  blt .bothtowards
  2783.  
  2784. ; bgt .firstaway
  2785.  tst.w d3
  2786.  blt .bothtowards
  2787.  bra .bothaway
  2788.  
  2789. .firsttowards:
  2790.  tst.w d3
  2791.  ble .bothtowards
  2792.  
  2793. ; First is towards and second away...
  2794.  
  2795.  move.w d0,d7    ; total length
  2796.  move.w d0,d6
  2797.  neg.w d2
  2798.  add.w d2,d3
  2799.  muls d2,d6
  2800.  divs d3,d6    ; length of first bit
  2801.  sub.w d6,d7    ; length of second bit
  2802.  move.w d6,FIRSTLEN
  2803.  move.w d7,LASTLEN
  2804.  
  2805.  tst.w FIRSTLEN
  2806.  beq .bothaway
  2807.  tst.w LASTLEN
  2808.  beq .bothtowards
  2809.  
  2810.  moveq #0,d2
  2811.  moveq #0,d3
  2812.  moveq #0,d4
  2813.  moveq #0,d5
  2814.  move.b 6(a0),d2
  2815.  move.b 7(a0),d3
  2816.  
  2817.  move.w d2,FIRSTU
  2818.  move.w d3,FIRSTV
  2819.  
  2820.  move.w d2,d4
  2821.  move.w d3,d5
  2822.  sub.w #128,d2
  2823.  sub.w #128,d3
  2824.  muls d2,d2
  2825.  muls d3,d3
  2826.  add.l d3,d2
  2827.  jsr CALCSQROOT
  2828.  
  2829.  tst.w d2
  2830.  beq.s .nochng
  2831.  
  2832.  sub.w #128,d4
  2833.  sub.w #128,d5
  2834.  muls #127,d4
  2835.  muls #127,d5
  2836.  divs d2,d4
  2837.  divs d2,d5
  2838.  add.w #128,d4
  2839.  add.w #128,d5
  2840.  
  2841. .nochng:
  2842.  
  2843.  move.w d4,MIDU
  2844.  move.w d5,MIDV
  2845.  
  2846.  move.b 6+RIGHTUVS-LEFTUVS(a0),d4
  2847.  move.b 7+RIGHTUVS-LEFTUVS(a0),d5
  2848.  move.w d4,SECU
  2849.  move.w d5,SECV
  2850.  
  2851.  move.w d4,d2
  2852.  move.w d5,d3
  2853.  
  2854.  sub.w #128,d2
  2855.  sub.w #128,d3
  2856.  muls d2,d2
  2857.  muls d3,d3
  2858.  add.l d3,d2
  2859.  jsr CALCSQROOT
  2860.  
  2861.  tst.w d2
  2862.  beq.s .nochng2
  2863.  
  2864.  sub.w #128,d4
  2865.  sub.w #128,d5
  2866.  muls #127,d4
  2867.  muls #127,d5
  2868.  divs d2,d4
  2869.  divs d2,d5
  2870.  add.w #128,d4
  2871.  add.w #128,d5
  2872.  
  2873. .nochng2:
  2874.  
  2875.  add.w MIDU,d4
  2876.  add.w MIDV,d5
  2877.  asr.w #1,d4
  2878.  asr.w #1,d5
  2879.  move.w d4,MIDU
  2880.  move.w d5,MIDV 
  2881.  
  2882.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2883.  move.l (a0)+,d2 
  2884.  
  2885.  and.l #$ffffff,d2
  2886.  and.l #$ffffff,d7
  2887.  
  2888.  moveq #0,d3
  2889.  moveq #0,d5
  2890.  move.w d2,d3
  2891. ; bge.s .okp1
  2892. ; moveq #0,d3
  2893. ;.okp1
  2894.  move.w d7,d5
  2895. ; bge.s .okp2
  2896. ; moveq #0,d5
  2897. ;.okp2
  2898.  
  2899.  swap d3
  2900.  swap d5
  2901.  sub.l d3,d5
  2902.  divs.l d0,d5
  2903.  asr.l #8,d5
  2904.  move.w d5,RIGHTBRIGHT
  2905.  asr.l #8,d3
  2906.  move.w d3,LEFTBRIGHT
  2907.  
  2908.  clr.w d2
  2909.  clr.w d7
  2910.  sub.l d2,d7
  2911.  asl.l #8,d2
  2912.  divs.l d0,d7
  2913.  asl.l #8,d7
  2914.  
  2915.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  2916.  move.l (a0)+,d3
  2917.  
  2918.  moveq #0,d4
  2919.  moveq #0,d5
  2920.  
  2921. ; move.w d6,d5
  2922. ; move.w d3,d4
  2923. ; move.b #0,d4
  2924. ; move.b #0,d5
  2925.  
  2926.  move.w FIRSTU,d4
  2927.  move.w MIDU,d5
  2928.  lsl.l #8,d4
  2929.  lsl.l #8,d5
  2930.  
  2931.  sub.l d4,d5
  2932.  divs.l FIRSTLEN-2,d5
  2933.  
  2934.  move.w d4,d2
  2935.  move.w d5,d7
  2936.  move.l d7,a1
  2937.  moveq #0,d4
  2938.  moveq #0,d5
  2939.  
  2940. ; move.b d6,d5
  2941. ; move.b d3,d4
  2942.  
  2943. ; swap d5
  2944. ; swap d4
  2945.  
  2946.  move.w FIRSTV,d4
  2947.  move.w MIDV,d5
  2948.  swap d4
  2949.  swap d5
  2950.  
  2951.  sub.l d4,d5
  2952.  divs.l FIRSTLEN-2,d5
  2953.  
  2954.  move.l d5,a3
  2955.  move.l d4,d5
  2956.   
  2957.  clr.w d3
  2958.  clr.w d6
  2959.  sub.l d3,d6
  2960.  divs.l d0,d6
  2961.  move.l d6,a4
  2962.  
  2963.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2964.  move.w (a0)+,d4
  2965.  swap d7
  2966.  clr.w d7
  2967.  swap d4
  2968.  clr.w d4
  2969.  sub.l d4,d7
  2970.  divs.l d0,d7
  2971.  move.l d7,a5
  2972.  
  2973. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  2974. ; swap d7
  2975. ; clr.w d7
  2976.  move.w (a0)+,d7
  2977. ; swap d5
  2978. ; clr.w d5
  2979. ; sub.l d5,d7
  2980. ; divs.l d0,d7
  2981. ; move.l d7,a6
  2982.  
  2983.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2984.  swap d7
  2985.  clr.w d7
  2986.  move.w (a0)+,d6
  2987.  swap d6
  2988.  clr.w d6
  2989.  sub.l d6,d7
  2990.  divs.l d0,d7
  2991.  
  2992.  lsl.l #8,d6
  2993.  lsl.l #8,d7
  2994.  
  2995.  move.w RIGHTBRIGHT,d7
  2996.  move.l d7,a6
  2997.  
  2998.  
  2999.  move.l a0,-(a7)
  3000.  move.l d1,-(a7)
  3001.  move.l #TEXTURES,a0
  3002.  move.w TEXTUREADD,d7
  3003.  bge.s .okaddtes3
  3004.  and.w #$7fff,d7
  3005.  add.l #65536*4,a0
  3006. .okaddtes3:
  3007.  ext.l d7
  3008. ; add.l d7,d7
  3009.  asl.l #8,d7
  3010.  add.l d7,a0
  3011.  move.w #0,d7
  3012.  
  3013.  move.w LEFTBRIGHT,d6
  3014.  
  3015.  subq #1,d0
  3016.  swap d0
  3017.  move.w HIGHPOLY,d0
  3018.  swap d0
  3019.  
  3020.  
  3021. ; d0=xdist
  3022. ; d2=U    a1=DU
  3023. ; d3=V  a4=DV
  3024. ; d4=X  a5=DX
  3025. ; d5=Y  a6=DY
  3026. ; d6=Z  a3=DZ
  3027.  
  3028. ; d0= polynum : polynum : counter : counter
  3029. ; d1= scratch : scratch : scratch : scratch
  3030. ; d2= u : uacc : sv : svacc
  3031. ; d3= v : v : vacc : vacc
  3032. ; d4= x : x : xacc : xacc
  3033. ; d5= su : su : suacc : suacc
  3034. ; d6= z : zacc : bright : brightacc
  3035. ; d7= scratch : scratch : scratch : scratch
  3036.  
  3037. ; a0= textures
  3038. ; a1= uspeed : uspeed : suspeed : suspeed
  3039. ; a2= screen pointer
  3040. ; a3= svspeed : svspeed : svspeed : svspeed
  3041. ; a4= vspeed : vspeed : vspeed : vspeed
  3042. ; a5= xspeed : xspeed : xspeed : xspeed
  3043. ; a6= zspeed : zspeed :brightspeed : brightspeed
  3044. ; a7= shadowmap pointer
  3045.  
  3046.  
  3047.  move.w FIRSTLEN,d0
  3048.  sub.w #1,d0
  3049.  bsr STARTLINE
  3050.  
  3051.  move.l #0,d5
  3052.  move.w #0,d2
  3053.  move.l #0,a3
  3054.  
  3055.  move.w LASTLEN,d0
  3056.  sub.w #1,d0
  3057.  
  3058.  bsr STARTLINE
  3059.  
  3060.  
  3061.  move.l (a7)+,d1
  3062.  move.l (a7)+,a0
  3063.  move.l (a7)+,a2
  3064.  
  3065.  bra .noline
  3066.  
  3067. .firstaway:
  3068.  tst.w d3
  3069.  bge .bothaway
  3070.  
  3071.  
  3072. ; first is away and second is towards...
  3073.  
  3074. ; this really isn't going to work...
  3075.  
  3076.  move.w d0,d7    ; total length
  3077.  move.w d0,d6
  3078.  neg.w d3
  3079.  add.w d2,d3
  3080.  muls d2,d6
  3081.  divs d3,d6    ; length of first bit
  3082.  sub.w d6,d7    ; length of second bit
  3083.  move.w d6,FIRSTLEN
  3084.  move.w d7,LASTLEN
  3085.  
  3086.  tst.w FIRSTLEN
  3087.  beq .bothaway
  3088.  tst.w LASTLEN
  3089.  beq .bothtowards
  3090.  
  3091.  moveq #0,d2
  3092.  moveq #0,d3
  3093.  moveq #0,d4
  3094.  moveq #0,d5
  3095.  move.b 6(a0),d2
  3096.  move.b 7(a0),d3
  3097.  
  3098.  move.w d2,FIRSTU
  3099.  move.w d3,FIRSTV
  3100.  
  3101.  move.w d2,d4
  3102.  move.w d3,d5
  3103.  sub.w #128,d2
  3104.  sub.w #128,d3
  3105.  muls d2,d2
  3106.  muls d3,d3
  3107.  add.l d3,d2
  3108.  jsr CALCSQROOT
  3109.  
  3110.  tst.w d2
  3111.  beq.s .nochng22
  3112.  
  3113.  sub.w #128,d4
  3114.  sub.w #128,d5
  3115.  muls #127,d4
  3116.  muls #127,d5
  3117.  divs d2,d4
  3118.  divs d2,d5
  3119.  add.w #128,d4
  3120.  add.w #128,d5
  3121.  
  3122. .nochng22:
  3123.  
  3124.  move.w d4,MIDU
  3125.  move.w d5,MIDV
  3126.  
  3127.  moveq #0,d4
  3128.  moveq #0,d5
  3129.  move.b 6+RIGHTUVS-LEFTUVS(a0),d4
  3130.  move.b 7+RIGHTUVS-LEFTUVS(a0),d5
  3131.  move.w d4,SECU
  3132.  move.w d5,SECV
  3133.  
  3134.  move.w d4,d2
  3135.  move.w d5,d3
  3136.  
  3137.  sub.w #128,d2
  3138.  sub.w #128,d3
  3139.  muls d2,d2
  3140.  muls d3,d3
  3141.  add.l d3,d2
  3142.  jsr CALCSQROOT
  3143.  
  3144.  tst.w d2
  3145.  beq.s .nochng222
  3146.  
  3147.  sub.w #128,d4
  3148.  sub.w #128,d5
  3149.  muls #127,d4
  3150.  muls #127,d5
  3151.  divs d2,d4
  3152.  divs d2,d5
  3153.  add.w #128,d4
  3154.  add.w #128,d5
  3155.  
  3156. .nochng222:
  3157.  
  3158.  add.w MIDU,d4
  3159.  add.w MIDV,d5
  3160.  asr.w #1,d4
  3161.  asr.w #1,d5
  3162.  move.w d4,MIDU
  3163.  move.w d5,MIDV
  3164.  
  3165.  
  3166.  move.l RIGHTUVS-LEFTUVS(a0),d7
  3167.  move.l (a0)+,d2 
  3168.  
  3169.  and.l #$ffffff,d2
  3170.  and.l #$ffffff,d7
  3171.  
  3172.  moveq #0,d3
  3173.  moveq #0,d5
  3174.  move.w d2,d3
  3175.  move.w d7,d5
  3176.  swap d3
  3177.  swap d5
  3178.  sub.l d3,d5
  3179.  divs.l d0,d5
  3180.  asr.l #8,d5
  3181.  move.w d5,RIGHTBRIGHT
  3182.  asr.l #8,d3
  3183.  move.w d3,LEFTBRIGHT
  3184.  
  3185.  clr.w d2
  3186.  clr.w d7
  3187.  sub.l d2,d7
  3188.  asl.l #8,d2
  3189.  divs.l d0,d7
  3190.  asl.l #8,d7
  3191.  
  3192.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  3193.  move.l (a0)+,d3
  3194.  
  3195.  moveq #0,d4
  3196.  moveq #0,d5
  3197.  
  3198.  move.w MIDU,d4
  3199.  move.w SECU,d5
  3200.  lsl.w #8,d4
  3201.  lsl.w #8,d5
  3202.  
  3203. ; move.w d6,d5
  3204. ; move.w d3,d4
  3205. ; move.b #0,d4
  3206. ; move.b #0,d5
  3207.  
  3208.  sub.l d4,d5
  3209.  divs.l LASTLEN-2,d5
  3210.  
  3211.  move.w d4,d2
  3212.  move.w d5,d7
  3213.  move.l d7,a1
  3214.  moveq #0,d4
  3215.  moveq #0,d5
  3216.  
  3217.  move.w MIDV,d4
  3218.  move.w SECV,d5
  3219.  
  3220.  swap d5
  3221.  swap d4
  3222.  
  3223.  sub.l d4,d5
  3224.  divs.l LASTLEN-2,d5
  3225.  
  3226.  move.l d5,a3
  3227.  move.l d4,d5
  3228.  
  3229.  clr.w d3
  3230.  clr.w d6
  3231.  sub.l d3,d6
  3232.  divs.l d0,d6
  3233.  move.l d6,a4
  3234.  
  3235.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3236.  move.w (a0)+,d4
  3237.  swap d7
  3238.  clr.w d7
  3239.  swap d4
  3240.  clr.w d4
  3241.  sub.l d4,d7
  3242.  divs.l d0,d7
  3243.  move.l d7,a5
  3244.  
  3245. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  3246. ; swap d7
  3247. ; clr.w d7
  3248.  move.w (a0)+,d7
  3249. ; swap d5
  3250. ; clr.w d5
  3251. ; sub.l d5,d7
  3252. ; divs.l d0,d7
  3253. ; move.l d7,a6
  3254.  
  3255.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3256.  swap d7
  3257.  clr.w d7
  3258.  move.w (a0)+,d6
  3259.  swap d6
  3260.  clr.w d6
  3261.  sub.l d6,d7
  3262.  divs.l d0,d7
  3263.  
  3264.  lsl.l #8,d6
  3265.  lsl.l #8,d7
  3266.  
  3267.  move.w RIGHTBRIGHT,d7
  3268.  move.l d7,a6
  3269.  
  3270.  move.l a0,-(a7)
  3271.  move.l d1,-(a7)
  3272.  move.l #TEXTURES,a0
  3273.  move.w TEXTUREADD,d7
  3274.  bge.s .okaddtes4
  3275.  and.w #$7fff,d7
  3276.  add.l #65536*4,a0
  3277. .okaddtes4:
  3278.  ext.l d7
  3279. ; add.l d7,d7
  3280.  asl.l #8,d7
  3281.  add.l d7,a0
  3282.  move.w #0,d7
  3283.  
  3284.  move.w LEFTBRIGHT,d6
  3285.  
  3286.  
  3287.  subq #1,d0
  3288.  swap d0
  3289.  move.w HIGHPOLY,d0
  3290.  swap d0
  3291.  
  3292.  
  3293. ; d0=xdist
  3294. ; d2=U    a1=DU
  3295. ; d3=V  a4=DV
  3296. ; d4=X  a5=DX
  3297. ; d5=Y  a6=DY
  3298. ; d6=Z  a3=DZ
  3299.  
  3300. ; d0= polynum : polynum : counter : counter
  3301. ; d1= scratch : scratch : scratch : scratch
  3302. ; d2= u : uacc : sv : svacc
  3303. ; d3= v : v : vacc : vacc
  3304. ; d4= x : x : xacc : xacc
  3305. ; d5= su : su : suacc : suacc
  3306. ; d6= z : zacc : bright : brightacc
  3307. ; d7= scratch : scratch : scratch : scratch
  3308.  
  3309. ; a0= textures
  3310. ; a1= uspeed : uspeed : suspeed : suspeed
  3311. ; a2= screen pointer
  3312. ; a3= svspeed : svspeed : svspeed : svspeed
  3313. ; a4= vspeed : vspeed : vspeed : vspeed
  3314. ; a5= xspeed : xspeed : xspeed : xspeed
  3315. ; a6= zspeed : zspeed :brightspeed : brightspeed
  3316. ; a7= shadowmap pointer
  3317.  
  3318.  move.w d2,-(a7)
  3319.  move.l d5,-(a7)
  3320.  move.l a3,-(a7)
  3321.  
  3322.  move.w #0,d2
  3323.  move.l #0,d5
  3324.  move.l #0,a3
  3325.  
  3326.  move.w FIRSTLEN,d0
  3327.  subq #1,d0
  3328.  bsr STARTLINE
  3329.  
  3330.  
  3331.  move.l (a7)+,a3
  3332.  move.l (a7)+,d5
  3333.  move.w (a7)+,d2
  3334.  
  3335.  move.w LASTLEN,d0
  3336.  subq #1,d0
  3337.  
  3338.  bsr STARTLINE
  3339.  
  3340.  
  3341.  move.l (a7)+,d1
  3342.  move.l (a7)+,a0
  3343.  move.l (a7)+,a2
  3344.  
  3345.  bra .noline
  3346.  
  3347.  
  3348. .bothaway:
  3349.  
  3350.  move.w #0,6+RIGHTUVS-LEFTUVS(a0)
  3351.  move.w #0,6(a0)
  3352.  
  3353. .bothtowards:
  3354.  
  3355.  ifne PH
  3356.  tst.w 16+RIGHTUVS-LEFTUVS(a0)
  3357.  blt.s .okone
  3358.  tst.w 16(a0)
  3359.  blt.s .okone
  3360.  
  3361.  move.w #0,2(a0)
  3362.  move.w #0,2+RIGHTUVS-LEFTUVS(a0)
  3363.  move.w #0,14(a0)
  3364.  move.w #0,14+RIGHTUVS-LEFTUVS(a0)
  3365.  
  3366. .okone:
  3367.  endc
  3368.  
  3369.  move.l RIGHTUVS-LEFTUVS(a0),d7
  3370.  move.l (a0)+,d2 
  3371.  
  3372.  and.l #$ffffff,d2
  3373.  and.l #$ffffff,d7
  3374.  
  3375.  moveq #0,d3
  3376.  moveq #0,d5
  3377.  move.w d2,d3
  3378.  move.w d7,d5
  3379.  swap d3
  3380.  swap d5
  3381.  sub.l d3,d5
  3382.  divs.l d0,d5
  3383.  asr.l #8,d5
  3384.  move.w d5,RIGHTBRIGHT
  3385.  asr.l #8,d3
  3386.  move.w d3,LEFTBRIGHT
  3387.  
  3388.  clr.w d2
  3389.  clr.w d7
  3390.  sub.l d2,d7
  3391.  asl.l #8,d2
  3392.  divs.l d0,d7
  3393.  asl.l #8,d7
  3394.  
  3395.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  3396.  move.l (a0)+,d3
  3397.  
  3398.  moveq #0,d4
  3399.  moveq #0,d5
  3400.  
  3401.  move.w d6,d5
  3402.  move.w d3,d4
  3403.  move.b #0,d4
  3404.  move.b #0,d5
  3405.  
  3406.  sub.l d4,d5
  3407.  divs.l d0,d5
  3408.  
  3409.  move.w d4,d2
  3410.  move.w d5,d7
  3411.  move.l d7,a1
  3412.  moveq #0,d4
  3413.  moveq #0,d5
  3414.  
  3415.  move.b d6,d5
  3416.  move.b d3,d4
  3417.  
  3418.  swap d5
  3419.  swap d4
  3420.  
  3421.  sub.l d4,d5
  3422.  divs.l d0,d5
  3423.  
  3424.  move.l d5,a3
  3425.  move.l d4,d5
  3426.  
  3427.   
  3428.  clr.w d3
  3429.  clr.w d6
  3430.  sub.l d3,d6
  3431.  divs.l d0,d6
  3432.  
  3433.  asr.l #8,d3        ; XX XX vpos vacc
  3434.  asr.l #8,d6         ; XX XX vspeed vspeed
  3435.  
  3436. ; move.l d6,a4
  3437.  
  3438.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3439.  move.w (a0)+,d4
  3440.  swap d7
  3441.  clr.w d7
  3442.  swap d4
  3443.  clr.w d4
  3444.  sub.l d4,d7
  3445.  divs.l d0,d7
  3446.  asl.l #8,d4
  3447.  asl.l #8,d7
  3448.  move.w d3,d4
  3449.  move.w d6,d7
  3450.  move.l d7,a5
  3451.  
  3452. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  3453. ; swap d7
  3454. ; clr.w d7
  3455.  move.w (a0)+,d7
  3456. ; swap d5
  3457. ; clr.w d5
  3458. ; sub.l d5,d7
  3459. ; divs.l d0,d7
  3460. ; move.l d7,a6
  3461.  
  3462.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3463.  swap d7
  3464.  clr.w d7
  3465.  move.w (a0)+,d6
  3466.  swap d6
  3467.  clr.w d6
  3468.  sub.l d6,d7
  3469.  divs.l d0,d7
  3470.  
  3471.  lsl.l #8,d6
  3472.  lsl.l #8,d7
  3473.  
  3474.  move.w RIGHTBRIGHT,d7
  3475.  move.l d7,a6
  3476.  
  3477.  moveq #0,d7
  3478.  moveq #0,d3
  3479.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3480.  move.w (a0)+,d3
  3481.  
  3482.  addq #2,a0
  3483.  
  3484.  sub.w d3,d7
  3485.  swap d3
  3486.  swap d7
  3487.  divs.l d0,d7
  3488.  
  3489.  move.l d7,a4
  3490.  
  3491.  
  3492.  move.l a0,-(a7)
  3493.  move.l d1,-(a7)
  3494.  move.l #TEXTURES,a0
  3495.  move.w TEXTUREADD,d7
  3496.  bge.s .okaddtes5
  3497.  and.w #$7fff,d7
  3498.  add.l #65536*4,a0
  3499. .okaddtes5:
  3500.  ext.l d7
  3501.  asl.l #8,d7
  3502.  add.l d7,a0
  3503.  move.w #0,d7
  3504.  
  3505.  move.w LEFTBRIGHT,d6
  3506.  
  3507.  subq #1,d0
  3508.  swap d0
  3509.  move.w HIGHPOLY,d0
  3510.  swap d0
  3511.  
  3512.  
  3513. ; d0=xdist
  3514. ; d2=U    a1=DU
  3515. ; d3=V  a4=DV
  3516. ; d4=X  a5=DX
  3517. ; d5=Y  a6=DY
  3518. ; d6=Z  a3=DZ
  3519.  
  3520. ; d0= polynum : polynum : counter : counter
  3521. ; d1= scratch : scratch : scratch : scratch
  3522. ; d2= u : uacc : sv : svacc
  3523. ; d3= pxpos : pxpos : pxacc : pxacc
  3524. ; d4= x : xacc : v : vacc
  3525. ; d5= su : su : suacc : suacc
  3526. ; d6= z : zacc : pypos : pyacc
  3527. ; d7= scratch : scratch : scratch : scratch
  3528.  
  3529. ; a0= textures
  3530. ; a1= uspeed : uspeed : suspeed : suspeed
  3531. ; a2= screen pointer
  3532. ; a3= svspeed : svspeed : svspeed : svspeed
  3533. ; a4= pxspd : pxspd : pxspd : pxspd
  3534. ; a5= xspeed : xspeed : vspeed : vspeed
  3535. ; a6= zspeed : zspeed : pyspeed : pyspeed
  3536. ; a7= shadowmap pointer
  3537.  
  3538.  bsr STARTLINE
  3539.  
  3540.  move.l (a7)+,d1
  3541.  move.l (a7)+,a0
  3542.  move.l (a7)+,a2
  3543.  
  3544. .noline:
  3545.  add.w #320,a2
  3546.  
  3547.  swap d1
  3548.  dbra d1,DOAHORLINEGOUR
  3549.  
  3550.  bra NOPOLYGON
  3551.  
  3552.  
  3553.  
  3554.  
  3555.  
  3556. *******************************
  3557. STARTLINE:
  3558.  
  3559.  move.l a7,SAVESTACK
  3560.  move.l #SHADOWBUFFER,a7
  3561.  
  3562.  moveq #0,d1
  3563.  swap d6
  3564.  move.w d6,d1
  3565.  move.l d4,d7
  3566.  swap d7
  3567.  lsr.w #8,d7
  3568.  move.b d7,d1
  3569.  swap d6
  3570.  
  3571.  swap d0
  3572.  moveq #0,d7
  3573.  move.b (a7,d1.l*2),d7
  3574.  cmp.w d7,d0
  3575.  ble .startlight
  3576.  swap d0
  3577.  bra INTHEDARKGOUR
  3578. .startlight:
  3579.  swap d0
  3580.  bra INTHELIGHTGOUR 
  3581. .startdark:
  3582. ***********************************
  3583.  
  3584.  
  3585.  
  3586. PENUMBRAGOUR:
  3587.  moveq #0,d1
  3588.  swap d6
  3589.  move.w d6,d1
  3590.  move.l d4,d7
  3591.  lsr.l #8,d7
  3592.  swap d7
  3593.  move.b d7,d1
  3594.  swap d6
  3595.  add.l a5,d4
  3596.  add.l a6,d6
  3597.  add.l a3,d5
  3598.  
  3599.  swap d0
  3600.  moveq #0,d7
  3601.  move.b (a7,d1.l*2),d7
  3602.  cmp.w d7,d0
  3603.  ifne SHADOWMAP
  3604.  ble INTOLIGHTGOUR
  3605.  endc
  3606.  ifeq SHADOWMAP
  3607.  bra INTOLIGHTGOUR
  3608.  endc
  3609.  bra.s INTODARKGOUR
  3610.  
  3611. INTHEDARKGOUR:
  3612.  moveq #0,d1
  3613.  swap d6
  3614.  move.w d6,d1
  3615.  move.l d4,d7
  3616.  swap d7
  3617.  asr.w #8,d7
  3618.  move.b d7,d1
  3619.  swap d6
  3620.  add.l a5,d4
  3621.  add.l a6,d6
  3622.  add.l a3,d5
  3623.  
  3624.  swap d0
  3625.  moveq #0,d7
  3626.  move.b (a7,d1.l*2),d7
  3627.  cmp.w d7,d0
  3628.  ifne SHADOWMAP
  3629.  ble.s INTOPENUMGOUR
  3630.  endc
  3631.  ifeq SHADOWMAP
  3632.  bra INTOLIGHTGOUR
  3633.  endc
  3634. INTODARKGOUR:
  3635.  swap d0
  3636.  
  3637. ;**********************
  3638. ; moveq #0,d7
  3639. ;********************** 
  3640.  
  3641.  swap d2
  3642.  move.w d2,d1
  3643.  move.w d4,d7
  3644.  lsr.w #8,d7
  3645.  move.b d7,d1
  3646.  swap d2
  3647.  add.l a1,d2
  3648.  add.l a4,d3
  3649.  
  3650.  move.l #(31*32*256),d7
  3651.  move.b 1(a0,d1.w*4),d7
  3652.  bra DARKplottt
  3653.  
  3654. .noplottt
  3655.  addq #1,a2
  3656.  dbra d0,INTHEDARKGOUR
  3657.  bra DONEDONEBUM
  3658.  
  3659. INTOPENUMGOUR:
  3660.  swap d0
  3661.  
  3662. *********************
  3663. ; moveq #0,d7
  3664. *****************
  3665.  
  3666.  swap d2
  3667.  move.w d2,d1
  3668.  move.w d4,d7
  3669.  lsr.w #8,d7
  3670.  move.b d7,d1
  3671.  swap d2
  3672.  add.l a1,d2
  3673.  add.l a4,d3
  3674.  
  3675.  move.l (a0,d1.w*4),d1
  3676.  moveq #0,d7
  3677.  move.w d6,d7
  3678.  swap d3
  3679.  move.b d3,d7
  3680.  add.w d1,d7
  3681.  swap d3
  3682.  
  3683.  move.b 1(a7,d7.l*2),d7
  3684.  lsl.w #8,d7
  3685.  
  3686. ; sub.w #$1c00,d7
  3687.  asr.w #1,d7
  3688. ; add.w #$1c00,d7
  3689.  neg.w d7
  3690.  add.w #$1f00,d7
  3691.  sub.b d7,d7
  3692.  
  3693.  asl.l #5,d7
  3694.  swap d1
  3695.  move.b d1,d7
  3696.  
  3697.  
  3698.  bra.s PENUMplottt
  3699.  
  3700. .noplottt
  3701.  addq #1,a2
  3702.  dbra d0,PENUMBRAGOUR
  3703.  bra DONEDONEBUM
  3704.  
  3705.  
  3706. INTHELIGHTGOUR:
  3707.  
  3708.  moveq #0,d1
  3709.  swap d6
  3710.  move.w d6,d1
  3711.  move.l d4,d7
  3712.  swap d7
  3713.  lsr.w #8,d7
  3714.  move.b d7,d1
  3715.  swap d6
  3716.  add.l a5,d4
  3717.  add.l a6,d6
  3718.  add.l a3,d5
  3719.  
  3720.  swap d0
  3721.  moveq #0,d7
  3722.  move.b (a7,d1.l*2),d7
  3723.  cmp.w d7,d0
  3724.  
  3725.  
  3726.  ifne SHADOWMAP
  3727.  bgt.s INTOPENUMGOUR
  3728.  endc
  3729.  
  3730. INTOLIGHTGOUR:
  3731.  swap d0
  3732.  
  3733.  swap d2
  3734.  move.w d2,d1
  3735.  move.w d4,d7
  3736.  asr.w #8,d7
  3737.  move.b d7,d1
  3738.  swap d2
  3739.  
  3740.  move.l (a0,d1.w*4),d1        ; SPEC COL OFX OFY
  3741.  
  3742.  add.l a1,d2
  3743.  add.l a4,d3
  3744.  
  3745.  bra.s LIGHTPLOTT
  3746. .noplottt:
  3747.  addq #1,a2
  3748.  dbra d0,INTHELIGHTGOUR
  3749. FLIBBLEY:
  3750.  bra.s DONEDONEBUM
  3751.  
  3752. PENUMplottt
  3753.  move.b GOURPAL(pc,d7.l),(a2)+
  3754.  dbra d0,PENUMBRAGOUR
  3755.  bra.s DONEDONEBUM
  3756.  
  3757. DARKplottt
  3758.  move.b GOURPAL(pc,d7.l),(a2)+
  3759.  dbra d0,INTHEDARKGOUR
  3760.  bra.s DONEDONEBUM
  3761.  
  3762. LIGHTPLOTT:
  3763.  moveq #0,d7
  3764.  
  3765.  move.w d2,d7
  3766.  swap d5
  3767.  move.b d5,d7
  3768.  swap d5
  3769.  
  3770.  ifne BUMPSPEC
  3771.  add.w d1,d7    ; coord in spec map
  3772.  endc
  3773.  
  3774.  swap d1
  3775.  ifeq SPECMAP
  3776.  and.w #$ff,d1
  3777.  endc
  3778.  
  3779.  move.b 1(a7,d7.l*2),d7    ; specular value of point.
  3780.  lsl.w #8,d7
  3781.  
  3782.  ifne SPECULAR 
  3783.  add.w d7,d1
  3784.  endc
  3785.  
  3786.  ifeq SPECULAR
  3787.  tst.w d1
  3788.  endc
  3789.  
  3790.  bgt.s .okshiney
  3791.  and.w #$ff,d1
  3792. .okshiney
  3793.  
  3794.  move.w d6,d7
  3795.  swap d3
  3796.  move.b d3,d7
  3797.  swap d1
  3798.  
  3799.  ifne BUMPPHONG
  3800.  add.w d1,d7
  3801.  endc
  3802.  
  3803.  clr.w d1
  3804.  swap d1
  3805.  move.b 1(a7,d7.l*2),d7 ; brightness of point
  3806.  neg.b d7
  3807.  add.b #31,d7
  3808.  and.w #$ff,d7
  3809.  swap d7
  3810.  lsr.l #3,d7
  3811.  swap d3
  3812.  add.l d7,d1
  3813.  
  3814.  move.b GOURPAL(pc,d1.l),(a2)+
  3815.  dbra d0,INTHELIGHTGOUR
  3816. DONEDONEBUM:
  3817.  move.l SAVESTACK,a7
  3818.  rts
  3819.  
  3820. GOURPAL: incbin "ab3:includes/bigshadow.pal"
  3821.  
  3822.  
  3823.  
  3824.  
  3825. LEFTSHINEV: dc.l 0
  3826. RIGHTSHINEV: dc.l 0
  3827. LEFTSHINEU: dc.l 0
  3828. RIGHTSHINEU: dc.l 0
  3829.  
  3830. TOPPTR: dc.l 0
  3831. TOPPTNUM: dc.w 0
  3832. BOTPTNUM: dc.w 0
  3833. LEFTBRIGHT: dc.w 0
  3834. RIGHTBRIGHT: dc.l 0
  3835. LEFTSPEC: dc.w 0
  3836. RIGHTSPEC: dc.w 0
  3837.  
  3838. ***********************************************
  3839.     
  3840. SIMPLECALCLINE:
  3841.  move.l #ONSCREENPTS,a1
  3842.  
  3843.  move.w 2(a1,d0.w*4),d2        ;fy
  3844.  move.w 2(a1,d1.w*4),d7        ;sy
  3845.  
  3846.  move.l #RIGHTUVS,a3
  3847.  asr.w #2,d2
  3848.  asr.w #2,d7
  3849.  cmp.w d2,d7 
  3850.  beq .noline
  3851.  
  3852.  bgt.s .lineonright
  3853. .lineonleft:
  3854.  move.l #LEFTUVS,a3
  3855.  exg d0,d1
  3856.  exg d2,d7
  3857.  
  3858. .lineonright:
  3859.  move.w d0,TOPPTNUM
  3860.  move.w d1,BOTPTNUM
  3861.  
  3862.  sub.w d2,d7
  3863.  move.w d2,d3
  3864.  muls #20,d3
  3865.  asl.w #4,d2
  3866.  add.w d3,a3
  3867.  move.l a3,TOPPTR
  3868.  
  3869.  move.w d7,YDIFF
  3870.  
  3871.  move.w (a1,d0.w*4),d3        ;fx
  3872.  move.w (a1,d1.w*4),d7        ;sx
  3873.  
  3874.  sub.w d3,d7
  3875.  swap d3
  3876.  swap d7
  3877.  clr.w d3
  3878.  clr.w d7
  3879.  divs.l YDIFF-2,d7
  3880.  move.l d7,a0    ; dx
  3881.  
  3882.  move.l #UVCOORDS,a2
  3883.  move.l #SHADOWPTS,a1
  3884.  
  3885.  move.w (a2,d0.w*4),d4
  3886.  move.w 2(a2,d0.w*4),d5
  3887.  move.w (a2,d1.w*4),d6
  3888.  move.w 2(a2,d1.w*4),d7
  3889.  
  3890.  sub.w d4,d6
  3891.  sub.w d5,d7
  3892.  swap d4
  3893.  swap d5
  3894.  clr.w d4
  3895.  clr.w d5
  3896.  swap d6
  3897.  swap d7
  3898.  clr.w d6
  3899.  clr.w d7
  3900.  
  3901.  divs.l YDIFF-2,d6
  3902.  divs.l YDIFF-2,d7
  3903.  
  3904.  move.l d6,a4
  3905.  move.l d7,a5
  3906.  
  3907.  muls #10,d0
  3908.  muls #10,d1
  3909.  move.l (a1,d0.w),d6
  3910.  
  3911.  move.l (a1,d1.w),d7
  3912.  asl.l #5,d6
  3913.  asl.l #5,d7
  3914.  sub.l d6,d7
  3915.  divs.l YDIFF-2,d7
  3916.  move.l d7,a2
  3917.  move.l d6,a6
  3918.  
  3919.  move.l 4(a1,d0.w),d6
  3920.  move.l 4(a1,d1.w),d7
  3921.  asl.l #5,d6
  3922.  asl.l #5,d7
  3923.  sub.l d6,d7
  3924.  divs.l YDIFF-2,d7
  3925.  exg d7,a6
  3926.  exg d7,d6
  3927.  
  3928.  move.w 8(a1,d0.w),d0
  3929.  move.w 8(a1,d1.w),d1
  3930.  swap d0
  3931.  swap d1
  3932.  clr.w d0
  3933.  clr.w d1
  3934.  asr.l #2,d0
  3935.  asr.l #2,d1
  3936.  sub.l d0,d1
  3937.  divs.l YDIFF-2,d1
  3938.  move.l d1,a1
  3939.  move.l YDIFF-2,d1
  3940.  subq #1,d1
  3941.  
  3942. ; d3=sx a0=dsx
  3943. ; d4=u a4=du
  3944. ; d5=v a5=dv
  3945. ; d6=x a2=dx
  3946. ; d7=y a6=dy
  3947. ; d0=z a1=dz
  3948. ; d1=dsy
  3949.  
  3950.  
  3951.  add.l #128*65536,d6
  3952.  add.l #128*65536,d7
  3953.  add.l #128*65536,d0
  3954.  
  3955. .PUTINLINE:
  3956.  swap d3
  3957.  move.w d3,(a3)+
  3958.  swap d3
  3959.  add.l a0,d3
  3960.  move.l d4,(a3)+
  3961.  add.l a4,d4
  3962.  move.l d5,(a3)+
  3963.  swap d6
  3964.  add.l a5,d5
  3965.  move.w d6,(a3)+
  3966.  swap d6
  3967.  swap d7
  3968.  add.l a2,d6
  3969.  move.w d7,(a3)+
  3970.  swap d7
  3971.  swap d0
  3972.  add.l a6,d7
  3973.  move.w d0,(a3)+
  3974.  addq #4,a3
  3975.  swap d0
  3976.  add.l a1,d0
  3977.  dbra d1,.PUTINLINE
  3978.  
  3979.  tst.b Gouraud
  3980.  beq .noline
  3981.  
  3982.  move.w TOPPTNUM,d0
  3983.  move.w BOTPTNUM,d1
  3984.  move.l TOPPTR,a3
  3985.  moveq #0,d6
  3986.  move.w YDIFF,d6
  3987.  
  3988.  move.l #SPECBRIGHTS,a2
  3989.  
  3990.  moveq #0,d2
  3991.  moveq #0,d3
  3992.  move.b (a2,d0.w*4),d2
  3993.  move.b 1(a2,d0.w*4),d3
  3994.  sub.w #128,d2
  3995.  sub.w #128,d3
  3996.  
  3997.  move.w d2,d4
  3998.  move.w d3,d5
  3999.  muls ACOS,d2
  4000.  muls ASIN,d3
  4001.  sub.l d3,d2
  4002.  muls ASIN,d4
  4003.  muls ACOS,d5
  4004.  add.l d5,d4
  4005.  asl.l #2,d2
  4006.  swap d2
  4007.  asl.l #2,d4
  4008.  swap d4
  4009.  
  4010.  add.w #128,d2
  4011.  add.w #128,d4
  4012.  move.w d2,FSX
  4013.  move.w d4,FSY
  4014.  
  4015.  moveq #0,d2
  4016.  moveq #0,d3
  4017.  move.b (a2,d1.w*4),d2
  4018.  move.b 1(a2,d1.w*4),d3
  4019.  sub.w #128,d2
  4020.  sub.w #128,d3
  4021.  
  4022.  move.w d2,d4
  4023.  move.w d3,d5
  4024.  muls ACOS,d2
  4025.  muls ASIN,d3
  4026.  sub.l d3,d2
  4027.  muls ASIN,d4
  4028.  muls ACOS,d5
  4029.  add.l d5,d4
  4030.  asl.l #2,d2
  4031.  swap d2
  4032.  asl.l #2,d4
  4033.  swap d4
  4034.  
  4035.  add.w #128,d2
  4036.  add.w #128,d4
  4037.  move.w d2,SSX
  4038.  move.w d4,SSY
  4039.  
  4040.  
  4041.  move.w 2(a2,d0.w*4),d2
  4042.  move.w 2(a2,d1.w*4),d3
  4043.  
  4044.  asr.w #4,d2
  4045.  asr.w #4,d3
  4046.  
  4047.  bra .bothtowards
  4048.  
  4049.  tst.w d2
  4050.  blt .firsttowards
  4051.  bgt.s .firstaway
  4052.  
  4053.  tst.w d3
  4054.  ble .bothtowards
  4055.  bra .bothaway
  4056.  
  4057. .firstaway
  4058.  tst.w d3
  4059.  blt .sectowards
  4060.  bra .bothaway
  4061.  
  4062. .firsttowards:
  4063.  tst.w d3
  4064.  ble .bothtowards
  4065.  
  4066. ; First one is towards, the second away.
  4067. ; Do the line in two bits: one heading
  4068. ; from the first point to the rim, the
  4069. ; other heading from the rim to the second
  4070. ; point and flagged as behind.
  4071.  
  4072.  move.w d6,d7    ; total length to draw
  4073.  move.w d2,FIRSTY
  4074.  move.w d3,LASTY
  4075.  
  4076.  neg.w d2
  4077.  add.w d2,d3     ; total change in Y
  4078.  
  4079.  bra.s .onetowards
  4080.  
  4081. .sectowards:
  4082.  move.w d6,d7    ; total length to draw
  4083.  move.w d2,FIRSTY
  4084.  move.w d3,LASTY
  4085.  neg.w d3
  4086.  add.w d2,d3
  4087.  
  4088. .onetowards:
  4089.  
  4090.  muls d2,d6
  4091.  divs d3,d6    ; length of first bit of line.
  4092.  
  4093.  ext.l d6
  4094.  ext.l d7
  4095.  
  4096.  move.w d6,FIRSTLEN
  4097.  sub.l d6,d7
  4098.  move.w d7,LASTLEN
  4099.  
  4100.  add.l d7,d6
  4101.  
  4102.  move.w FIRSTY,d2
  4103.  move.w LASTY,d3
  4104.  swap d2
  4105.  clr.w d2
  4106.  swap d3
  4107.  clr.w d3
  4108.  sub.l d2,d3
  4109.  divs.l d6,d3
  4110.  move.l d3,a6
  4111.  move.l d2,d7
  4112.  
  4113.  moveq #0,d2
  4114.  moveq #0,d3
  4115.  moveq #0,d4
  4116.  moveq #0,d5
  4117.  move.b (a2,d0.w*4),d2
  4118.  move.b 1(a2,d0.w*4),d3
  4119.  
  4120.  move.w d2,FIRSTU
  4121.  move.w d3,FIRSTV
  4122.  
  4123.  move.w d2,d4
  4124.  move.w d3,d5
  4125.  sub.w #128,d2
  4126.  sub.w #128,d3
  4127.  muls d2,d2
  4128.  muls d3,d3
  4129.  add.l d3,d2
  4130.  jsr CALCSQROOT
  4131.  
  4132.  tst.w d2
  4133.  beq.s .nochng
  4134.  
  4135.  sub.w #128,d4
  4136.  sub.w #128,d5
  4137.  muls #127,d4
  4138.  muls #127,d5
  4139.  divs d2,d4
  4140.  divs d2,d5
  4141.  add.w #128,d4
  4142.  add.w #128,d5
  4143.  
  4144. .nochng:
  4145.  
  4146.  move.w d4,MIDU
  4147.  move.w d5,MIDV
  4148.  
  4149.  move.b (a2,d1.w*4),d4
  4150.  move.b 1(a2,d1.w*4),d5
  4151.  move.w d4,SECU
  4152.  move.w d5,SECV
  4153.  
  4154. ; move.w d4,d2
  4155. ; move.w d5,d3
  4156. ;
  4157. ; sub.w #128,d2
  4158. ; sub.w #128,d3
  4159. ; muls d2,d2
  4160. ; muls d3,d3
  4161. ; add.l d3,d2
  4162. ; jsr CALCSQROOT
  4163. ;
  4164. ; tst.w d2
  4165. ; beq.s .nochng2
  4166. ;
  4167. ; sub.w #128,d4
  4168. ; sub.w #128,d5
  4169. ; muls #127,d4
  4170. ; muls #127,d5
  4171. ; divs d2,d4
  4172. ; divs d2,d5
  4173. ; add.w #128,d4
  4174. ; add.w #128,d5
  4175. ;.nochng2:
  4176. ;
  4177. ; add.w MIDU,d4
  4178. ; add.w MIDV,d5
  4179. ; asr.w #1,d4
  4180. ; asr.w #1,d5
  4181. ; move.w d4,MIDU
  4182. ; move.w d4,MIDV
  4183.  
  4184.  move.l #NORMBRIGHTS,a2
  4185.  move.w (a2,d0.w*2),d0
  4186.  move.w (a2,d1.w*2),d1
  4187.  
  4188.  sub.w d0,d1
  4189.  swap d1
  4190.  swap d0
  4191.  divs.l d6,d1
  4192.  
  4193.  move.w FIRSTLEN,d6
  4194.  beq.s .nofirstbit
  4195.  ext.l d6
  4196.  
  4197.  moveq #0,d2
  4198.  moveq #0,d3
  4199.  moveq #0,d4
  4200.  moveq #0,d5
  4201.  move.w FIRSTU,d2
  4202.  move.w MIDU,d3
  4203.  move.w FIRSTV,d4
  4204.  move.w MIDV,d5
  4205.  
  4206.  sub.w d2,d3
  4207.  swap d2
  4208.  swap d3
  4209.  divs.l d6,d3
  4210.  move.l d3,a4
  4211.  
  4212.  sub.w d4,d5
  4213.  swap d4
  4214.  swap d5
  4215.  divs.l d6,d5
  4216.  move.l d5,a5
  4217.  
  4218.  bsr DOABITOFLINE
  4219. .nofirstbit:
  4220.  
  4221.  move.w LASTLEN,d6
  4222.  beq.s .nosecbit
  4223.  ext.l d6
  4224.  
  4225.  moveq #0,d2
  4226.  moveq #0,d3
  4227.  moveq #0,d4
  4228.  moveq #0,d5
  4229.  move.w MIDU,d2
  4230.  move.w SECU,d3
  4231.  move.w MIDV,d4
  4232.  move.w SECV,d5
  4233.  
  4234.  sub.w d2,d3
  4235.  swap d2
  4236.  swap d3
  4237.  divs.l d6,d3
  4238.  move.l d3,a4
  4239.  
  4240.  sub.w d4,d5
  4241.  swap d4
  4242.  swap d5
  4243.  divs.l d6,d5
  4244.  move.l d5,a5
  4245.  
  4246.  bsr DOABITOFLINE
  4247. .nosecbit:
  4248.  
  4249.  bra .noline
  4250.  
  4251. .bothaway
  4252.  
  4253. ; Both are away, so do it simply.
  4254.  
  4255. .bothtowards:
  4256.  
  4257. ; Both are towards, so do it simply and flag all
  4258. ; points as towards.
  4259.  
  4260.  swap d2
  4261.  clr.w d2
  4262.  swap d3
  4263.  clr.w d3
  4264.  sub.l d2,d3
  4265.  divs.l d6,d3
  4266.  move.l d3,a6
  4267.  move.l d2,d7
  4268.  
  4269.  moveq #0,d2
  4270.  moveq #0,d3
  4271.  moveq #0,d4
  4272.  moveq #0,d5
  4273. ; move.b (a2,d0.w*4),d2
  4274. ; move.b (a2,d1.w*4),d3
  4275. ; move.b 1(a2,d0.w*4),d4
  4276. ; move.b 1(a2,d1.w*4),d5
  4277.  
  4278.  move.w FSX,d2
  4279.  move.w SSX,d3
  4280.  move.w FSY,d4
  4281.  move.w SSY,d5
  4282.  
  4283.  sub.w d2,d3
  4284.  swap d2
  4285.  swap d3
  4286.  divs.l d6,d3
  4287.  move.l d3,a4
  4288.  
  4289.  sub.w d4,d5
  4290.  swap d4
  4291.  swap d5
  4292.  divs.l d6,d5
  4293.  move.l d5,a5
  4294.  
  4295.  move.l #NORMBRIGHTS,a2
  4296.  movem.l d2/d4,-(a7)
  4297.  
  4298.  moveq #0,d2
  4299.  moveq #0,d3
  4300.  move.b (a2,d0.w*2),d2
  4301.  move.b 1(a2,d0.w*2),d3
  4302.  sub.w #128,d2
  4303.  sub.w #128,d3
  4304.  
  4305.  move.w d2,d4
  4306.  move.w d3,d5
  4307.  muls ACOS,d2
  4308.  muls ASIN,d3
  4309.  sub.l d3,d2
  4310.  muls ASIN,d4
  4311.  muls ACOS,d5
  4312.  add.l d5,d4
  4313.  asl.l #2,d2
  4314.  swap d2
  4315.  asl.l #2,d4
  4316.  swap d4
  4317.  
  4318.  add.w #128,d2
  4319.  add.w #128,d4
  4320.  move.w d2,FSX
  4321.  move.w d4,FSY
  4322.  
  4323.  moveq #0,d2
  4324.  moveq #0,d3
  4325.  move.b (a2,d1.w*2),d2
  4326.  move.b 1(a2,d1.w*2),d3
  4327.  sub.w #128,d2
  4328.  sub.w #128,d3
  4329.  
  4330.  move.w d2,d4
  4331.  move.w d3,d5
  4332.  muls ACOS,d2
  4333.  muls ASIN,d3
  4334.  sub.l d3,d2
  4335.  muls ASIN,d4
  4336.  muls ACOS,d5
  4337.  add.l d5,d4
  4338.  asl.l #2,d2
  4339.  swap d2
  4340.  asl.l #2,d4
  4341.  swap d4
  4342.  
  4343.  add.w #128,d2
  4344.  add.w #128,d4
  4345.  move.w d2,SSX
  4346.  move.w d4,SSY
  4347.  
  4348.  moveq #0,d0
  4349.  moveq #0,d1
  4350.  moveq #0,d3
  4351.  moveq #0,d5
  4352.  
  4353.  move.w FSY,d3
  4354.  move.w SSY,d5
  4355.  move.w FSX,d0
  4356.  move.w SSX,d1
  4357.  
  4358.  ext.l d0
  4359.  ext.l d1
  4360.  sub.w d0,d1
  4361.  swap d1
  4362.  swap d0
  4363.  divs.l d6,d1
  4364.  
  4365.  ext.l d3
  4366.  ext.l d5
  4367.  sub.w d3,d5
  4368.  swap d5
  4369.  swap d3
  4370.  divs.l d6,d5
  4371.  
  4372.  movem.l (a7)+,d2/d4
  4373.  
  4374.  move.l d6,-(a7)
  4375.  bsr DOABITOFLINE
  4376.  move.l (a7)+,d6
  4377.  
  4378.  move.w TOPPTNUM,d0
  4379.  move.w BOTPTNUM,d1
  4380.  move.l TOPPTR,a3
  4381.  move.l #NORMVECTS,a2
  4382.  muls #6,d0
  4383.  muls #6,d1
  4384.  moveq #0,d2
  4385.  moveq #0,d3
  4386.  move.w 2(a2,d0.w),d2    ; firsty
  4387.  move.w 2(a2,d1.w),d3    ; secy
  4388.  sub.w d2,d3
  4389.  swap d3
  4390.  swap d2
  4391.  divs.l d6,d3
  4392.  
  4393.  subq #1,d6
  4394. .stickiny
  4395.  swap d2
  4396.  move.w d2,18(a3)
  4397.  swap d2
  4398.  add.l d3,d2
  4399.  add.w #20,a3
  4400.  dbra d6,.stickiny
  4401.  
  4402. .noline:
  4403.  rts
  4404.  
  4405.  DOABITOFLINE:
  4406.  subq #1,d6
  4407.  
  4408. .STICKINGOUR:
  4409.  swap d7
  4410.  move.b d7,2(a3)
  4411.  swap d7
  4412.  add.l a6,d7
  4413.  swap d0
  4414.  move.w d0,4(a3)
  4415.  swap d0
  4416.  add.l d1,d0
  4417.  swap d2
  4418.  move.b d2,8(a3)
  4419.  swap d4
  4420.  move.b d4,9(a3)
  4421.  swap d4
  4422.  swap d3
  4423.  move.w d3,16(a3)
  4424.  swap d3
  4425.  add.l d5,d3
  4426.  
  4427.  adda.w #20,a3
  4428.  swap d2
  4429.  add.l a4,d2
  4430.  add.l a5,d4
  4431.  dbra d6,.STICKINGOUR
  4432.  
  4433.  rts
  4434.  
  4435. FIRSTY: dc.w 0
  4436. LASTY: dc.w 0
  4437. FIRSTU: dc.w 0
  4438. SECU: dc.w 0
  4439. FIRSTV: dc.w 0
  4440. SECV: dc.w 0
  4441.     dc.w 0
  4442. FIRSTLEN: dc.w 0
  4443.     dc.w 0
  4444. LASTLEN: dc.w 0
  4445. MIDU: dc.w 0
  4446. MIDV: dc.w 0
  4447.  
  4448. *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  4449.  
  4450.  
  4451.  
  4452. ************************************************
  4453. ************************************************
  4454. ************************************************
  4455. ************************************************
  4456. ************************************************
  4457. ************************************************
  4458. ************************************************
  4459. ************************************************
  4460. ************************************************
  4461. ************************************************
  4462. ************************************************
  4463. ************************************************
  4464. ************************************************
  4465. ************************************************
  4466. ************************************************
  4467. ************************************************
  4468. ************************************************
  4469.  
  4470.  move.w d3,TOPLINE
  4471.  move.w d4,BOTLINE
  4472.  
  4473.  
  4474.  
  4475.  
  4476. *********************************************
  4477.  
  4478. CALCSQROOT:
  4479.  tst.l d2
  4480.  beq .oksqr
  4481.  
  4482.  movem.l d0/d1/d3-d7/a0-a6,-(a7)
  4483.  
  4484.  move.w #31,d0
  4485. .findhigh
  4486.  btst d0,d2
  4487.  bne .foundhigh
  4488.  dbra d0,.findhigh
  4489. .foundhigh
  4490.  asr.w #1,d0
  4491.  clr.l d3
  4492.  bset d0,d3
  4493.  move.l d3,d0
  4494.  
  4495.  move.w d0,d1
  4496.  muls d1,d1    ; x*x
  4497.  sub.l d2,d1    ; x*x-a
  4498.  asr.l #1,d1    ; (x*x-a)/2
  4499.  divs d0,d1    ; (x*x-a)/2x
  4500.  sub.w d1,d0    ; second approx
  4501.  bgt .stillnot0
  4502.  move.w #1,d0
  4503. .stillnot0
  4504.  
  4505.  move.w d0,d1
  4506.  muls d1,d1
  4507.  sub.l d2,d1
  4508.  asr.l #1,d1
  4509.  divs d0,d1
  4510.  sub.w d1,d0    ; second approx
  4511.  bgt .stillnot02
  4512.  move.w #1,d0
  4513. .stillnot02
  4514.  
  4515.  move.w d0,d1
  4516.  muls d1,d1
  4517.  sub.l d2,d1
  4518.  asr.l #1,d1
  4519.  divs d0,d1
  4520.  sub.w d1,d0    ; second approx
  4521.  bgt .stillnot03
  4522.  move.w #1,d0
  4523. .stillnot03
  4524.  
  4525.  move.w d0,d2
  4526.  ext.l d2
  4527.  
  4528.  movem.l (a7)+,d0/d1/d3-d7/a0-a6
  4529.  
  4530. .oksqr
  4531.  rts
  4532.  
  4533.  
  4534. **********************************************
  4535. **********************************************
  4536. **********************************************
  4537. **********************************************
  4538. **********************************************
  4539. **********************    ************************
  4540. **********************************************
  4541. **********************************************
  4542. **********************************************
  4543. **********************************************
  4544. **********************************************
  4545. **********************************************
  4546. **********************************************
  4547. **********************************************
  4548. **********************************************
  4549. **********************************************
  4550. **********************************************
  4551. **********************************************
  4552. **********************************************
  4553.  
  4554. TOPLINE: dc.w 0
  4555. BOTLINE: dc.w 0
  4556.  
  4557.  
  4558.  
  4559. **********************************************
  4560. **********************************************
  4561. **********************************************
  4562. **********************************************
  4563. **********************************************
  4564. **********************************************
  4565. **********************************************
  4566. **********************************************
  4567. **********************************************
  4568. **********************************************
  4569. **********************************************
  4570. **********************************************
  4571. **********************************************
  4572. **********************************************
  4573. **********************************************
  4574. **********************************************
  4575. **********************************************
  4576. **********************************************
  4577. **********************************************
  4578.     
  4579.  
  4580.     
  4581.  dc.w 0
  4582. YDIFF: dc.w 0
  4583.  
  4584. SPINAROUND: dc.w 0    
  4585. XCOS: dc.w 0
  4586. YCOS: dc.w 0
  4587. XSIN: dc.w 0
  4588. YSIN: dc.w 0
  4589. XCOS3: dc.w 0
  4590. YCOS3: dc.w 0
  4591. XSIN3: dc.w 0
  4592. YSIN3: dc.w 0
  4593. XCOS2: dc.w 0
  4594. YCOS2: dc.w 0
  4595. XSIN2: dc.w 0
  4596. YSIN2: dc.w 0
  4597. XADD: dc.l 0
  4598. YADD: dc.l 0
  4599. ZADD: dc.l 0
  4600. XOFF: dc.w 0
  4601. YOFF: dc.w 0
  4602. OLDXM: dc.w 0
  4603. OLDYM: dc.w 0
  4604.  
  4605.  
  4606.  
  4607. TEXTUREADD: dc.w 0
  4608.  
  4609.  
  4610. **********************************************************
  4611.  
  4612. UVCOORDS: ds.l 250
  4613. ROTATEDPTS: ds.l 250*4
  4614. SHADOWPTS: ds.l 250*4
  4615. ONSCREENPTS: ds.l 250
  4616.  
  4617. ZOFF:
  4618.  ifeq LARGESCREEN
  4619.  dc.w 768
  4620.  endc
  4621.  ifne LARGESCREEN
  4622.  dc.w 630
  4623.  endc
  4624.  
  4625. LEFTRIGHT: ds.l 256
  4626.  
  4627. POLYGONDATA:
  4628.  ds.b 30000
  4629.  
  4630. OBJNAME: dc.b "ab3:vectobj/testcube",0
  4631.  even
  4632. doslibname: dc.b 'dos.library',0
  4633.  even
  4634. doslib: dc.l 0
  4635.  
  4636. ****************************
  4637.  
  4638. SINETABLE:
  4639.  incbin "ab3:includes/bigsine"
  4640.  
  4641.  
  4642. YANG: dc.w 0
  4643. XANG: dc.w 0
  4644.  
  4645.  
  4646. xmouse: dc.w 0
  4647. ymouse: dc.w 0
  4648.  
  4649. spleen: dc.w 0
  4650. lastspleen: dc.w 0
  4651.  
  4652. COPIEDPAL:
  4653.  dc.w 256,0
  4654.  ds.l 3*256
  4655.  ds.l 10
  4656.  
  4657. SHADOWBUFFER:
  4658. HIGHLIGHT: incbin "work:temp/HIGHLIGHT"
  4659.  
  4660. PALETTEBIT:
  4661. ; incbin "256palette"
  4662. ; dc.w $ffff,$fffe
  4663.  
  4664.  incbin "ab3:shadowtex/shadowpal"
  4665.  
  4666.  include "ab3:source_4000/chunky.s"
  4667.  
  4668. willy: ds.w 48
  4669.  
  4670.  
  4671. PALS:
  4672.  ds.l 2*49
  4673.  
  4674. pregour: dc.b 0
  4675. Gouraud: dc.b 0
  4676.  
  4677. PointAngPtr: dc.l 0
  4678. FRAMENUM: dc.w 0
  4679. PolyAngPtr: dc.l 0
  4680. PtsPtr: dc.l 0
  4681. LinesPtr: dc.l 0
  4682. POINTER_TO_POINTERS: dc.l 0
  4683. FRAME: dc.w 4
  4684. FLIBBLE: dc.w 0
  4685. START_OF_OBJECT: dc.l 0
  4686. num_points: dc.w 0
  4687. num_frames: dc.w 0
  4688. SORTIT: dc.w 0
  4689. PartBuffer: ds.l 2*32
  4690. endparttab:
  4691.  
  4692. x1: dc.w 0
  4693. y1: dc.w 0
  4694. z1: dc.w 0
  4695. x2: dc.w 0
  4696. y2: dc.w 0
  4697. z2: dc.w 0
  4698. x2b: dc.w 0
  4699. y2b: dc.w 0
  4700. z2b: dc.w 0
  4701.  
  4702. x3: dc.w 0
  4703. y3: dc.w 0
  4704. z3: dc.w 0
  4705.  
  4706. l1: dc.w 0
  4707. l2: dc.w 0
  4708.  
  4709. OBJONOFF: dc.l 0
  4710.  
  4711. SAVEHIGHS: ds.w 30
  4712.  
  4713. FASTBUFFER:
  4714.  dc.l fasty
  4715.  
  4716. fasty: ds.b 320*256
  4717.  
  4718.  ifne MOTIONBLUR
  4719. fasty2:
  4720.  ds.b 320*256
  4721.  endc
  4722.  
  4723. NORMBRIGHTS: ds.w 250
  4724.  
  4725. SPECBRIGHTS:
  4726.  dcb.l 100,31
  4727.  
  4728. ENDNORM:
  4729.  
  4730. LEFTUVS: ds.w 10*256
  4731. RIGHTUVS: ds.w 10*256
  4732.  
  4733. NORMVECTS: ds.w 3*250
  4734.  
  4735. ;WORLD: incbin "ab3:includes/world"
  4736.  
  4737. ;TWEEN: incbin "ab3:includes/tweenbrightfile"
  4738.  
  4739.  
  4740.  
  4741. NEBBIE: incbin "work:temp/nebbieroar"
  4742.     ds.l (192/4)*16
  4743.  
  4744.  SECTION blib,code_f
  4745.  
  4746. TEXTURES:
  4747.  incbin "ab3:shadowtex/shadowmaps"
  4748.  even
  4749.  
  4750. BLUR:
  4751.  ifne MOTIONBLUR
  4752.  incbin "ab3:shadowtex/blurfile"
  4753.  endc
  4754.  
  4755. Font: dc.l fontplace
  4756.  
  4757. fontplace: incbin "ab3:XENFONT.bin"
  4758. CHUNKYBUFFER:    dc.l    0
  4759. CHUNKYCOMPARE:    dc.l    0
  4760. CHIPBUF1:    dc.l    0
  4761. CHIPBUF2:    dc.l    0
  4762. SCREENBASE:    dc.l    0
  4763.  
  4764.  SIG1: dc.l 0
  4765.  SIG2: dc.l 0
  4766.  
  4767. RAWPTR: dc.l RAWSCRN
  4768. RAWPTR2: dc.l RAWSCRN2
  4769.  
  4770.  SECTION BGDROP,code_c
  4771.  
  4772. RAWSCRN:
  4773.  ds.l 2560*8
  4774. RAWSCRN2:
  4775.  ds.l 2560*8
  4776.